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")的语句不会同步数据库中的表。
转自:点击打开链接
分享到:
相关推荐
Hibernate中session的merge以及update方法
示例 4a - 使用session.merge(..)更新非 Hibernate 托管实体。 示例 5 - 删除会话中已存在具有相同标识符的实体的非 Hibernate 受管实体。 示例 5a - 在删除非 Hibernate 受管实体之前首先使用session.merge(..) 。...
我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...
Hibernate中的merge使用详情解说
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实例...
4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...............................................................................22 4.4 如何改变SESSION BEAN的JNDI 名称...............................
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实例...
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...
计算机视觉的深度学习 Packt的《用于计算机视觉的深度学习》的代码存储库 这是发布的“ 的代码库。 它包含从头到尾完成本书所必需的所有支持...train_summary_writer = tf.summary.FileWriter('/tmp/train' , session.g
具体的方法是:设置两个writer,一个用于写训练的数据,一个用于写测试数据,并且这两个writer分别存在train和test路径中,注意测试的writer不能加sess.graph如下代码所示。 ... train_log_dir = 'logs/train/' ...
今天照着样例搞了下tensorboard,...summary_op=tf.summary.merge_all() 原位置如下: 我把summary_op给放再with tf.Session() 下了。这样子做是没有效果了,summary_op相当于没有被赋值。所以导致我没有获得我想要保
为了避免这些查询, 分别使用了如下方法. 首先, 建立一个Hash表, 开始的时候所有空闲Session都串到Hash[0]处, 每当来一个 新的客户端时,从Hash[0]中取出Session, 链到相应的hashid上. 为此, hash所得的值 不能为0, ...
解决方法: 在C:/Users/DELL/.ssh/中新建一个config文件 并写入: 重新执行 $ git push -u origin master: 这个方法是从国外一个人的博客中找的,具体原理是什么我还不太清楚,但是觉得似乎有一点点风险。先占个...
为了避免这些查询, 分别使用了如下方法. 首先, 建立一个Hash表, 开始的时候所有空闲Session都串到Hash[0]处, 每当来一个 新的客户端时,从Hash[0]中取出Session, 链到相应的hashid上. 为此, hash所得的值 不能为0, ...
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)...
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 更新游离...
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 更新游离...
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 更新游离...
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 更新游离...