两张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());
}
}
比如上一段代码,若设置fetch=FetchType.LAZY,则会出现错误,因为session在commit之后已经被关闭,无法从数据库取出user;但在commit之前取出user则可以实现。