您的位置:首页 > 其它

Hibernate——关联关系的CRUD(增删改查)一

2017-07-18 20:13 323 查看
两张ManyToOne双向关联的表Group和User

(一)增

通过保存user把group也保存

@Test
public void testSaveUser() {
User u = new User();
Group g = new Group();
u.setName("u1");
g.setName("g1");
u.setGroup(g);

Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(u);
session.getTransaction().commit();

}


ManyToOne有一个cascade(级联)属性,@ManyToOne(cascade={CascadeType.ALL})

对父表的操作会同步到子表(cascade影响增删改(CUD),不影响读取(R))

通过保存group把user也保存

public void testSaveGroup() {
User u1 = new User();
User u2 = new User();
Group g = new Group();
u1.setName("u1");
u2.setName("u2");
u1.setGroup(g);
u2.setGroup(g);
g.setName("g1");
g.getUsers().add(u1);
g.getUsers().add(u2);

Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(g);
session.getTransaction().commit();

}
@OneToMany(cascade=CascadeType.ALL)

可以看出通过一的这方保存多的这方要麻烦很多

(二)读

默认情况下读取Many的一方会自动把One的一方也取出来,而读取One的一方则不会自动读取Many的一方。

如果想要通过One读取Many,需要

@OneToMany(mappedBy="group",
cascade=CascadeType.ALL,
fetch=FetchType.EAGER)

(尽量不要两边同时设EAGER)

fetch影响读取(R)
@Test
public void testGet() {
testSaveGroup();

Session session = sf.getCurrentSession();
session.beginTransaction();
Group g = (Group)session.get(Group.class, 1);
session.getTransaction().commit();
for(User u:g.getUsers()){
System.out.println(u.getName());
}

}

如果A和B之间的关联是LAZY而不是EAGER,那么取出A的时候不会取出B,等到使用B时B才会被取出(从数据库到内存)
比如上一段代码,若设置fetch=FetchType.LAZY,则会出现错误,因为session在commit之后已经被关闭,无法从数据库取出user;但在commit之前取出user则可以实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: