1. 表关联(一对一)
如user表关联company表,在user类添加company的成员变量:
// onetoone关联子表
private User_child childUser;
@OneToOne(targetEntity=User_child.class, fetch=FetchType.LAZY, cascade=CascadeType.ALL)
public User_child getChildUser() {
return childUser;
}
public void setChildUser(User_child childUser) {
this.childUser = childUser;
}
当使用user.save方法时,优先将其成员childUser保存,再保存user表。
其中OneToOne的参数如下:
属性 | 是否必须 | 说明 |
cascade | 否 | 指定Hibernate对关联实体怎样的级联策略,该级联策略支持如下5个属性值: 1:CascadeType.ALL :指定Hibernate将所有持久化操作都被关联到关联实体。 Save update delete saveorupdate PERSIST merge 2:CascadeType.MERGE:指定Hibernate将merge操作级联到关联实体。 3:CascadeType.PERSIST:指定Hibernate讲persis操作级联到关联实体。 4:CascadeType.REFRESH:指定Hibernate将refresh操作级联到关联实体 5:CascadeType.REMOVE:指定Hibernate将remove操作关联到关联实体 |
fetch | 否 | 指定抓取关联实体时的抓取策略,该属性支持如下两个属性值: FetchType.EAGER:抓取实体时,立即抓取关联实体,这是默认值 FetchType.LAZY:抓取实体时,延迟抓取关联实体,等到真正用到关联实体时才去抓取。 |
mappedBy | 否 | 指定关联实体中的属性可以引用的实体父类。 |
orphanRemoval | 否 | 是否删除孤儿实体,如果某个实体所关联的父实体不存在,改实体就是所谓的孤儿实体。 |
optional | 否 | 该属性置顶关联关系是否可选 |
targetEntity | 否 | 该属性置顶关联实体的类名,在默认情况下,Hibernate通过反射来判断关联实体的类名。 |
如,当cascade为CascadeType.PERSIST时,只有user.persis才能影响到company表,使用user.save方法是不会操作company表的。
又如,当fetch为FetchType.EAGER时,不管使用的是user.load还是user.get,都会立马将company查出.
2. 表关联(N对一)
使用hibernate最重要的一点就是为了方便查询,级联查询,可以省略很多sql查询语句。但是会消耗一定的性能,所以不推荐使用。
// manytoone关联公司表
private Company company;
// user表中有个外键字段companyid
@JoinColumn(name="companyid", referencedColumnName="id")
@ManyToOne(targetEntity=Company.class, fetch=FetchType.LAZY, cascade=CascadeType.ALL)
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
属性 | 是否必须 | 说明 |
cascade | 否 | 指定Hibernate对关联实体怎样的级联策略,该级联策略支持如下5个属性值: 1:CascadeType.ALL :指定Hibernate将所有持久化操作都被关联到关联实体。 2:CascadeType.MERGE:指定Hibernate将merge或update操作级联到关联实体。 3:CascadeType.PERSIST:指定Hibernate讲persist或者save操作级联到关联实体。 4:CascadeType.REFRESH:指定Hibernate将refresh操作级联到关联实体 5:CascadeType.REMOVE:指定Hibernate将remove操作关联到关联实体 |
fetch | 否 | 指定抓取关联实体时的抓取策略,该属性支持如下两个属性值: FetchType.EAGER:抓取实体时,立即抓取关联实体,这是默认值 FetchType.LAZY:抓取实体时,延迟抓取关联实体,等到真正用到关联实体时才去抓取。 |
optional | 否 | 该属性置顶关联关系是否可选 |
targetEntity | 否 | 该属性置顶关联实体的类名,在默认情况下,Hibernate通过反射来判断关联实体的类名。 |
3. 表关联(一对N)
单向的一对N在开发中用的比较少,一般和上面的N对一配套使用,如下:
// 括号中写0表示长度为0,不占用内存空间,不写的话默认为10
private List<User> userList = new ArrayList<User>(0);
@OneToMany(cascade=CascadeType.ALL, mappedBy="company",fetch=FetchType.LAZY)
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
注:其中mappedBy的内容为User对象中的ManyToOne成员变量的名称,意思是当删除company的时候交由user中的company对象去负责。因为在级联情况下OneToMany中删除company的时候会先删user。
属性 | 是否必须 | 说明 |
cascade | 否 | 指定Hibernate对关联实体怎样的级联策略,该级联策略支持如下5个属性值: 1:CascadeType.ALL :指定Hibernate将所有持久化操作都被关联到关联实体。 2:CascadeType.MERGE:指定Hibernate将merge或update操作级联到关联实体。 3:CascadeType.PERSIST:指定Hibernate讲persist或者save操作级联到关联实体。 4:CascadeType.REFRESH:指定Hibernate将refresh操作级联到关联实体 5:CascadeType.REMOVE:指定Hibernate将remove操作关联到关联实体 |
fetch | 否 | 指定抓取关联实体时的抓取策略,该属性支持如下两个属性值: FetchType.EAGER:抓取实体时,立即抓取关联实体,这是默认值 FetchType.LAZY:抓取实体时,延迟抓取关联实体,等到真正用到关联实体时才去抓取。 |
mappedBy | 否 | 该属性合法的属性为关联实体的属性名,改属性置顶关联实体中那个属性可以引用当前实体. |
targetEntity | 否 | 该属性置顶关联实体的类名,在默认情况下,Hibernate通过反射来判断关联实体的类名。 |
一对N在开发中一般不用,因为太消耗资源,它不能分页。一般在外面使用查询语句分页查询就可以了,没必要使用一对N级联。
4. 表关联(N对N)
@ManyToMany
略
开发中并不推荐使用。