Hibernate——关联关系的CRUD(增删改查)一
2017-07-18 20:13
323 查看
两张ManyToOne双向关联的表Group和User
ManyToOne有一个cascade(级联)属性,@ManyToOne(cascade={CascadeType.ALL})
对父表的操作会同步到子表(cascade影响增删改(CUD),不影响读取(R))
通过保存group把user也保存
可以看出通过一的这方保存多的这方要麻烦很多
如果想要通过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则可以实现。
(一)增
通过保存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则可以实现。
相关文章推荐
- Hibernate——关联关系的CRUD(增删改查)二
- Hibernate中关联关系的CRUD(增删改查)
- 【Hibernate框架开发之七】Hibernate使用Annotation中各种关系映射的CRUD(增删改查)&&集合映射&&继承映射
- Hibernate学习笔记(2)----Hibernate中的增删改查(CRUD)
- 13hibernate hibernate关联关系的CRUD(增删改查)
- hibernate核心API和级联的增删改查(CRUD)
- Hibernate实现数据的增删改查(CRUD)操作
- 【Hibernate框架开发之七】Hibernate使用Annotation中各种关系映射的CRUD(增删改查)&&集合映射&&继承映射
- Hibernate基本概念与CRUD(增删改查)
- Hibernate关联关系的CRUD
- hibernate 关联关系CRUD
- HibernateSessionFactoryUtil类和封装了(增删改查)方法的HibernateTest类
- Mybatis实现数据的增删改查(CRUD)
- sping整合hibernate小例子,对Employee表实现增删改查
- Hibernate学习-06:CRUD(增删改查)操作之删除记录
- hibernate之通过session来实现增删改查操作
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
- Hibernate ManytoMany 标注级联增删改查完整操作
- JPA+Hibernate3 CRUD(增删改查操作)
- 传智播客-jpa与hibernate(2)-CRUD和关联关系