roup_id integer,
primary key (id)
)
?
alter table t_user
add constraint FK_e5f24mh6aryt9hsy99oydps6g
foreign key (group_id)
references t_group (id)
查看数据库中的信息:
select * from t_group;
?
select * from t_user;
?
数据保存成功。
?
8.双向关系在程序中要设置双向关联
9.双向关系要使用mappedBy
?
?
二、读取数据
还是一上面的例子做说明
1、读取User数据,是否能读取Group中的数据?
2、ManyToOne默认的情况下是可以取出One里的数据的,也就是说,获取User对象的数据的时候,是可以获取Group对象中的数据的。
3、读取Group数据的时候,是否能读取User中的数据?
4、cascade并不会影响读取,fetch管理读取
5、fetch的属性是Enum类型,分别为LAZY,EAGER。取值为LAZY时,不会获取User中的数据;取值为EAGER时,可以获取User的数据
6、JPA接口默认为一对多为Lazy,多对一为Eager,但是Hibernate反向工程生成Entity时,多对一为Lazy,需要手动改为Eager。
7、实验:
8、Group.java
package com.zgy.hibernate.model;
?
import java.util.HashSet;
import java.util.Set;
?
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.CascadeType;
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
private Set users = new HashSet();
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy="group",
cascade={CascadeType.ALL},
fetch=FetchType.EAGER
)
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
?
?
}
9、User.java
package com.zgy.hibernate.model;
?
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
?
@Entity
@Table(name="t_user")
public class User {
private int id;
private String name;
private Group group;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
?
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.ALL},
fetch=FetchType.LAZY
)
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
?
}
10、JUnit测试
@Test
public void testGetUser() {
testSaveGroup();
Session s = sf.openSession();
s.beginTransaction();
User u = (User)s.get(User.class, 1);
s.getTransaction().commit();
}
?
@Test
public void testGetGroup() {
testSaveGroup();
Session s = sf.openSession();
s.beginTransaction();
Group g = (Group)s.get(Group.class, 1);
s.getTransaction().commit();
for(User u : g.getUsers()){
System.out.println(u.getName());
}
}
11、结论
(1)将User设置为@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.LAZY的时候,将不再取得Group的属性。在session关闭前,如果使用到Group属性还是可以手动取得。Session关闭后将去得到Group的属性。
(2)@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.LAZY的时候,先取出的是User,再取出的是两者之间的关系。
Hibernate: select user0_.id as id1_1_0_, user0_.group_id as group_id3_1_0_, user0_.name as name2_1_0_ from t_user user0_ where user0_.id=?
Hibernate: select group0_.id as id1_0_0_, group0_.name as name2_0_0_, users1_.group_id as group_id3_0_1_, users1_.id as id1_1_1_, users1_.i