Hibernate Annotation简介

标签: hibernate
2017-12-30 阅读(108)

简单介绍下,我不是大神,只是略懂皮毛,备份mark下。


表名称与字段映射/长度

表名称映射

表名称映射,在默认情况下使用@Entity,则使用类名做为表名。

表名称映射,用@Table(name="t_user")


字段映射

所有的注解写在get()方法上面。

默认情况下,则使用属性名称来作为列名(字段名)

字段映射,用@Column(name="t_name")

映射长度,用@Column(name="t_name",length=20)

默认情况下会将所有的属性映射到表中,如果不想某个属性映射到表中,如下编写@Transient(瞬时、临时(或者透明))


题外话

annotation究竟是注解在字段上面还是注解在get()上面?

本人有点喜欢注解在字段上面,但千万不要学本人,我是也能不用关联关系我是尽量不用的。

有文件指出2个地方你只能选择一个地方注解,要么get,要么field,否则会抛异常。

但2中方式各有不同,具体未探究,规范一点还是建议放到get上方。

个人觉得:

放在字段field上面:

优点:整齐好看集中,一目了然,自动建表是创建字段不出现离奇事件,如boolean值字段。

缺点:已破坏了规范,已存在的id,在懒加载中只是getId()也会load整个对象。

放在get()上面:

优点:官方正规写法,已存在的id,懒加载中只是getId()不会去查询,直接返回Id。

缺点:零散而不好看,字段多滚来滚去也配不好,自动建表可能会遇到离奇情况,如boolean值字段。

总之,一般情况下,数据库表不需要自动生成或用注解指定字段名称,综合评价起来,还是在get上面注解的好。



关系映射

一对一外键关联映射(单向)

一对一外键关联映射(双向)

一对一主键关联映射

多对一关联映射

一对多关联映射(单向)

一对多关联映射(双向)

多对多关联映射(单向)

多对多关联映射(双向)



映射主键属性(ID生成策略)

@Id 注解可以将实体bean中的某个属性定义为标识符(identifier),

该属性的值可以通过应用自身进行设置(ID手动分配,但不能重复),也可以通过Hiberante生成(推荐)。

@GeneratedValue 注解可以定义该标识符的生成策略: 

AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.

TABLE - 使用表保存id值

IDENTITY - identity column

SEQUENCE - sequence。Oracle使用SEQUENCE。他会自动建一张SEQUENCE表,默认表名hibernate_sequence(可自定义)。

AUTO相当于XML映射文件中的Native

@Id
@GeneratedValue
//或@GeneratedValue(strategy=GenerationType.AUTO)//等等
public int getId() { ... }
//使用类SEQUENCE为主键生成策略,更改表名
@SequenceGenerator(name="yourname",sequenceName="USER_SEQ_DB")
public class Teacher {
    ...
    
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="yourname")
    public int getId() { ... }
    
    ...
}

... 表示省略很多代码



级联(cascade)属性

CascadeType.ALL(包括增、删、改、查,联动操作),其实查不算在内,查Fetch。我们一般都只设置CascadeType.ALL就好了。

CascadeType.MERGE(合并的join,级联合并,级联更新)

CascadeType.PERSIST(保存的时候在级联)

CascadeType.REFRESH(刷新说明:比如现在我查询出了数据,另外一个人在我查询数据之后,他对数据做了修改,这时才会级联上,hibernate会自动刷新我查询出来的数据)

CascadeType.REMOVE (只要在删除操作时才会级联)

Cascade不是必须的,他的作用只是可以让我们快速的开发,我们也可以通过手动增、删、改、查



Fetch捉取策略

FetchType.EAGER(渴望的,马上得到)

一对多关系

比如通过get()方法,get出一的一端,他只会出一条SQL语句,不会自动去查询多的一端,如果设置FetchType.EAGER,会将他的关联对象查询出来。

比如通过load()方法,他不会发出SQL语句,因为load支持延迟加载,只有真正获取数据时才会发SQL。

FetchType.LAZY(懒加载,只有真正获取数据时才发出SQL语句)

一对多默认是:FetchType.LAZY

多对一默认是:FetchType.EAGER




原创文章,转载请注明出处:https://www.weizhixi.com/user/index/article/id/45.html

分类:
点击(142) 阅读(108) 举报