1,基本属性
@Table
声明了该实体bean映射指定的表(table),目录(catalog)和schema名字
@Id
声明了该实体bean的标识属性(对应表中的主键)。
@Column
声明了属性到列的映射。该注解有如下的属性:
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)
table 可选,定义对应的表(默认为主表)
length 可选,列长度(默认值255)
precision 可选,列十进制精度(decimal precision)(默认值0)
scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
@GeneratedValue
声明了主键的生成策略。该注解有如下属性:
strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO
GenerationType.AUTO 主键由程序控制
GenerationType.TABLE 使用一个特定的数据库表格来保存主键
GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)
GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中的序列)。
GenericGenerator
声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性:
name 指定生成器名称,它被应用于@GeneratedValue的generator的值。
strategy 指定具体生成器的类名(指定生成策略)。
parameters 得到strategy指定的具体生成器所用到的参数。
@Transient
声明了非持久化属性,即数据库中没有相应的映射字段,是一个普通属性。
@Temporal
声明了日期类型。
TemporalType.DATE 日期,例:2011-04-12
TemporalType.TIME 时间,例:22:50:30
TemporalType.TIMESTAMP 日期和时间,例:2011-04-12 22:51:30
2 mappedBy详解
mappedBy:
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方;
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的;
4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。
下面是一个例子:
人跟身份证双向关联
在Person里面定义的注解:
在person里面定义的注释代码
- @OneToOne(cascade = CascadeTye.ALL,optional = true)
- public IDCard getIdCard(){
- return idCard;
- }
注意:在对应关系中mappedBy属性只用在拥有方
在idcard里面定义的注释代码
- @OneToOne(cascade = CascadeType.ALL,mappedBy = "idCard",optional = false)
- public Person getPerson(){
- return person;
- }
3 Hibernate映射文件中fetch属性的含义
有两个可选值:join和select
这个属性决定了你在查询的时候,是先查主表记录再查关联记录,还是要把关联表的记录一起查询出来。
select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询
如果lazy=true(延迟加载),select在查询时只会查出主表记录,用到了关联数据时再自动在执行查询
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
4 表之间的关系示例
一对一
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "THEMEID") //指定外键
@Cascade({CascadeType.ALL})
private BasTsTheme basTsTheme;
一对多
@OneToMany( fetch = FetchType.LAZY, mappedBy = "basTsGrade")
@Cascade({CascadeType.DELETE_ORPHAN,CascadeType.SAVE_UPDATE})
private Set<BasTsUser> basTsUsers = new HashSet<BasTsUser>(0);
多对一
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GRADEID")
@Cascade({CascadeType.SAVE_UPDATE})
private BasTsGrade basTsGrade;
多对多
@ManyToMany( fetch = FetchType.LAZY, mappedBy = "basTsRoles")
@Cascade({CascadeType.DELETE_ORPHAN,CascadeType.SAVE_UPDATE})
private Set<BasTsUser> basTsUsers = new HashSet<BasTsUser>(0);
@ManyToMany( fetch = FetchType.LAZY)
@JoinTable(name = "BAS_TR_ROLEUSER", schema = "DESK", joinColumns = { @JoinColumn(name = "USERID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "ROLEID", nullable = false, updatable = false) })
@Cascade({ CascadeType.DELETE_ORPHAN, CascadeType.SAVE_UPDATE })
private Set<BasTsRole> basTsRoles;
cascade(级联)
级联,就是对一个对象进行操作的时候,会把他相关联的对象也一并进行相应的操作
cascade关系有以下几种:
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点
其他应该度知道,说一下这个all-delete-orphan:什么是孤儿节点,举个例子,班级和学生,
一张classes表,一张student表,student表中有5个学生的数据,其5个学生都属于这个班级,
也就是这5个学生中的外键字段都指向那个班级,现在删除其中一个学生(remove),进行的数据
操作仅仅是将student表中的该学生的外键字段置为null,也就是说,则个学生是没有班级的,
所以称该学生为孤儿节点,我们本应该要将他完全删除的,但是结果并不如我们所想的那样,
所以设置这个级联属性,就是为了删除这个孤儿节点。也就是解决这类情况。