session.merge ()方法

session.merge ()方法

 

该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,也即该实体依然是脱管状,见例6.4。

例6.4:session.merge ()方法对状态的变化

     public void run() {

          //创建UserInfo实例

          UserInfo userInfo = new UserInfo();

          //使之成为脱管状态

          userInfo.setId(11112);

          userInfo.setName("RW3");

          userInfo.setSex("M");

          //创建UserInfo实例

          UserInfo userInfo2 = new UserInfo();

          //使之成为脱管状态

          userInfo2.setId(11112);

          userInfo2.setName("RW4");

          userInfo2.setSex("F");

          //启动Session

          Session session = HibernateSessionFactory.currentSession();

          //启动事务

          Transaction tx = session.beginTransaction();

          //调用merge方法,此时UserInfo实体状态并没有被持久化

          session.merge(userInfo);

          //调用merge方法后,此时UserInfo2实体状态并没有被持久化,但是数据库中的记录被更新了.

          ①session.merge(userInfo2);

          //merge方法与update方法的差别在于针对同样的操作update方法会报错

          //原因在于update方法使得实体状态成为了持久化状态,而Session中不允许两个持久化实体有同样的持久化标识

          ②//session.update(userInfo);

          //session.update(userInfo2);

         //以下两句不会发送SQL,因为userInfo2不是持久化状态的实体

         ③userInfo2.setName("RW5");

          userInfo2.setSex("M");

          //提交事务

          tx.commit();

          //关闭Hibernate Session

          HibernateSessionFactory.closeSession();

     }

针对该段代码将执行如下SQL语句:

Hibernate:

/* ①session.merge(userInfo2)的动作 */

select

        userinfo0_.id as id0_0_,

        userinfo0_.NAME as NAME0_0_,

        userinfo0_.SEX as SEX0_0_,

        userinfo0_.roomid as roomid0_0_

    from

        userinfo userinfo0_

    where

        userinfo0_.id=?

Hibernate:

/* ①session.merge(userInfo2)的动作 */

update

            userinfo

        set

            NAME=?,

            SEX=?,

            roomid=?

        where

            id=?

session.merge()方法会首先发送一句select语句,去数据库端获取UserInfo持久化标识所对应的表记录;然后自动生成一个持久化状态的UserInfo实体,与脱管状态的UserInfo实体做比较是否有所改变;一旦发生了改变,才会发送update语句执行更新。而按执行顺序,若两句session.merge()方法针对同一个脱管状态的UserInfo实体,那其结果只会执行最后一个session.merge()方法所发出的update语句

即使执行了session.merge()方法,UserInfo实体依然是脱管状态,因此③userInfo2. setName("RW5")的语句不会同步数据库中的表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 中,`session.merge()` 方法用于将一个游离(detached)状态的实体对象与数据库中的持久化对象进行合并。 合并操作的作用是将一个游离状态的对象的属性值复制到持久化对象中,并将合并后的对象重新关联到 Session,以便进行后续的持久化操作。 `session.merge(Object obj)` 方法的使用方法如下: 1. 将一个游离状态的实体对象传递给 `session.merge()` 方法。例如: ```java User detachedUser = new User(); // 设置 detachedUser 的属性值 User mergedUser = session.merge(detachedUser); ``` 2. Hibernate 将会查找与 `detachedUser` 对象具有相同标识符的持久化对象(如果存在)。如果找到了持久化对象,则会将 `detachedUser` 的属性值复制到持久化对象中,并返回合并后的对象 `mergedUser`。 3. 如果没有找到与 `detachedUser` 对象具有相同标识符的持久化对象,则会创建一个新的持久化对象,并将 `detachedUser` 的属性值复制到新对象中。此时,返回的合并后的对象 `mergedUser` 将是一个全新的持久化对象。 需要注意的是,`session.merge()` 方法并不会修改传入的 `detachedUser` 对象本身,而是返回一个合并后的新对象。如果你希望使用合并后的对象,需要使用返回的合并后的对象。 另外,合并操作会触发数据库的读取和写入操作,因此需要在事务中使用 `session.merge()` 方法来确保数据的一致性和完整性。 希望这个解答对你有帮助。如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值