hibernate中如何使用merge()用法举例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate中如何使用merge()用法举例相关的知识,希望对你有一定的参考价值。

参考技术A 它跟saveOrUpdate()有些像,但是merge方法在执行之前都回去缓存中找是不是有相应的记录,也就是会有一条select语句,执行改语句的目的是为了判断该对象是否被修改了。而update就不管这些,直接就一条update语句或。如果查询出改记录不存在则直接再插入一条记录。用例:

User user = new User();

//user.setId(4);

user.setUsername("heyuanling2");

user.setAge(23);

user.setSex("w");

user.setPassword("heyuanling");

Session session = this.getSession();

Transaction tr = session.beginTransaction();

//User exituser = (User)session.get(User.class, new Integer(1));

session.merge(user);

tr.commit();

Hibernate中的merge方法

Hibernate中有一个常见的错误:

  A different object with the same identifier value was already associated with the session

在一个session中存在两个不同的实体却有着相同的身份标签(主键)是会报错的,想要避免这种错误可以使用Hibernate中的merge方法。

merge方法的作用:

  1. new一个对象并设置ID时,这个对象会被当作游离态处理,在使用merge时,如果在数据库中不能能找到这条记录,则使用insert将数据插入;如果在数据库中找到这条记录,则使用update将数据更新。
  2. new一个对象没有设置ID时,这个对象会被当作瞬态处理,在使用merge时会根据实体类的主键生成策略保存这条数据。
  3. 使用merge存储到数据库的对象,其本身不会转变为持久态对象。

HIbernate中对象的三态的补充:

  • 瞬态:通过Java关键字new的实体类对象,不和Session实例关联并且在数据库中没有和瞬态对象关联的记录,此时的对象还没有纳入Hibernate的缓存管理中。
  • 持久态: 已经被保存进数据库的实体对象,还存于Hibernate的缓存管理之中。
  • 游离态(脱管态):持久态对象脱离了Hibernate的缓存管理后就会变成游离态,游离态对象与瞬态对象的最大区别在于,游离态对象在数据库中可能存在一条与之对应的记录,而瞬态对象则不会在数据库中存在与之对应的记录,简而言之就是游离态对象比瞬态对象多了一个ID属性。

以上是关于hibernate中如何使用merge()用法举例的主要内容,如果未能解决你的问题,请参考以下文章

R语言之merge举例

oracle中 merge into 的用法

java merge

git merge用法

Hibernate中的merge使用详情解说

怎样使用Hibernate中的merge方法 merge方法和update方法的区别