Session中merge和update的区别

本文探讨了在Hibernate中Session的merge和update方法的区别。通过示例代码展示,当尝试更新一个已存在的persistent对象时,update会导致错误,而merge则能够成功执行,避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public void testMerge()
{


Teacher t = new Teacher();
t.setId(4);
t.setName("力量1");
t.setStudentNum("100");

//t为detached态


session = sf.openSession();


session.beginTransaction();

Teacher t2 = session.get(Teacher.class,4);

session.update(t);//

session.merge(t);//
//System.out.println("id"+t.getId());
/*Teacher t = session.get(Teacher.class,1);
session.clear();

t2.setName("liliang");
session.update(t2);*/
//System.out.println("id"+t.getId());
//session.get
//System.out.println(t.getClass());
session.getTransaction().commit();



session.close();
//System.out.println("id"+t.getName());
sf.close();



}

当使用update,因为有一个id为4的persistent态实例,会报错

使用merge时,能成功执行

首先,对于一个处于detatch状态的实体对象来说,要将其中的修改,合并到数据库中,有两种方法,一种方式,是调用update(),另一种方式是调用merge()
当调用update()时,首先要取保目标session中,不包含同样id的实体对象的引用,如果有的话,会抛出异常,完成update()方法后,这个实体对象从detatch状态,转换为persistent状态,在session提交前,后续对其的修改,都会被合并到数据库中。
当调用merge()对象时,无需考虑session中是否已经包含同样id的实体对象,如果session中没有同样id的实体对象,hibernate会通过select语句,从数据库中查询出对应对象,如果数据库中没有对应对象,就新建一个。同时,完成merge()操作后,会返回数据库中对应的persistent状态对象,而原有的,作为参数传入的实体对象,仍然是detatch状态,后续代码对其的修改,无法合并到数据库中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值