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

两张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则可以实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值