`
二当家的
  • 浏览: 23767 次
文章分类
社区版块
存档分类
最新评论

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方法,此时UserInfo实体状态并没有被持久化

          //但是数据库中的记录被更新了

          ①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")的语句不会同步数据库中的表。


转自:点击打开链接

分享到:
评论

相关推荐

    session中merge和update的区别

    Hibernate中session的merge以及update方法

    test-hibernate:了解一级缓存的工作原理

    示例 4a - 使用session.merge(..)更新非 Hibernate 托管实体。 示例 5 - 删除会话中已存在具有相同标识符的实体的非 Hibernate 受管实体。 示例 5a - 在删除非 Hibernate 受管实体之前首先使用session.merge(..) 。...

    Hibernate的Session的javadoc

    我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...

    Hibernate中的merge使用详情解说

    Hibernate中的merge使用详情解说

    EJB3.0 实例教程 -- 切片2

    6.5.3 更新 Merge() .........44 6.5.4 删除 Remove() .......44 6.5.5 执行 EJB3 QL操作createQuery() 44 6.6 关系/对象映射.45 6.6.1 映射的表名或列名与数据库保留字同名时的处理...........45 Jboss EJB3.0实例...

    EJB3.0实例教程

    4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...............................................................................22 4.4 如何改变SESSION BEAN的JNDI 名称...............................

    EJB3.0 实例教程 -- 切片1

    6.5.3 更新 Merge() .........44 6.5.4 删除 Remove() .......44 6.5.5 执行 EJB3 QL操作createQuery() 44 6.6 关系/对象映射.45 6.6.1 映射的表名或列名与数据库保留字同名时的处理...........45 Jboss EJB3.0实例...

    RunAsTI-master.zip

    There are reports that the tool does not work over an RDP session. The tool is actually a merge of 2 previous tools; RunAsSystem and RunFromToken. The curious ones might notice that RunFromToken is...

    Deep-Learning-for-Computer-Vision:Packt的《计算机视觉深度学习》

    计算机视觉的深度学习 Packt的《用于计算机视觉的深度学习》的代码存储库 这是发布的“ 的代码库。 它包含从头到尾完成本书所必需的所有支持...train_summary_writer = tf.summary.FileWriter('/tmp/train' , session.g

    tensorboard实现同时显示训练曲线和测试曲线

    具体的方法是:设置两个writer,一个用于写训练的数据,一个用于写测试数据,并且这两个writer分别存在train和test路径中,注意测试的writer不能加sess.graph如下代码所示。 ... train_log_dir = 'logs/train/' ...

    tensorboard 可以显示graph,却不能显示scalar的解决方式

    今天照着样例搞了下tensorboard,...summary_op=tf.summary.merge_all() 原位置如下: 我把summary_op给放再with tf.Session() 下了。这样子做是没有效果了,summary_op相当于没有被赋值。所以导致我没有获得我想要保

    P2P视频技术源码(VC)

    为了避免这些查询, 分别使用了如下方法. 首先, 建立一个Hash表, 开始的时候所有空闲Session都串到Hash[0]处, 每当来一个 新的客户端时,从Hash[0]中取出Session, 链到相应的hashid上. 为此, hash所得的值 不能为0, ...

    Git常见的报错

    解决方法: 在C:/Users/DELL/.ssh/中新建一个config文件 并写入: 重新执行 $ git push -u origin master: 这个方法是从国外一个人的博客中找的,具体原理是什么我还不太清楚,但是觉得似乎有一点点风险。先占个...

    P2P视频播放器 详细制作实例

    为了避免这些查询, 分别使用了如下方法. 首先, 建立一个Hash表, 开始的时候所有空闲Session都串到Hash[0]处, 每当来一个 新的客户端时,从Hash[0]中取出Session, 链到相应的hashid上. 为此, hash所得的值 不能为0, ...

    5-3tensorboard 网络运行

    merged=tf.summary.merge_all() #建立会话 with tf.Session() as sess: sess.run(init) writer=tf.summary.FileWriter('logs/',sess.graph) #设置循环次数 for epoch in range(51): for batch in range(n_batch)...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

Global site tag (gtag.js) - Google Analytics