Hibernate中将对象从托管状态转变为持久化状态可以采用两种方法:重附(Reattach)和合并(Merge)。下面分别总结一下:
第一种:重附
重附操作使得一个托管对象重新受到persistence context的管理,具体可以采用两种方法:
1. update方法,此方将实体对象从托管状态转变为持久化状态,但是需要注意的是如果当前的持久化上下文(persistence context)中已经存在了一个和托管对象有相同标识符的持久化对象就会抛出NonUniqueException,因为在持久化上下文中,对数据库表中的每一条记录来说,都只能有一个对象与其对应,这样方便持久化对象的脏检测。此方法强制一个update语句,进行持久化对象与数据库的同步。
2. lock方法。lock方法也用与将一个托管对象状态转化为持久化,但是此方法的限制是在确保对象没有被修改的情况下,如果在调用方法之前,修改了对象,那么当事务提交的时候,修改是不会被传播到数据库里的。
第2种:合并
合并就是将托管对象的状态复制到持久化对象里,然后生产一个新的持久化对象。并且合并还有一个作用就是可以将一个transient状态的对象变为persistent状态。在合并操作里,有两种情况:
1. 如果当前的持久化上下文种没有与托管对象相同标识符的对象,那么Hibernate隐式的调用select来查询,如果数据库种有记录,那么就将托管对象的状态与新查询到的对象进行合并,如果数据库没有对应的记录,那么就新建一个持久化对象,然后将托管对象的状态复制到持久化对象里。
2. 如果持久化上下文种有与托管对象相同标识符的对象,那么就将托管对象的状态复制到持久化对象里。(合并中需要注意的是原来托管的对象还是托管的,只不过merge返回的是一个新的持久化对象。)
需要注意的是JPA里只支持合并,不支持重附。
session.merge()方法
该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,也即该实体依然是脱管状。
session.merge()方法对状态的变化
public void run() {
UserInfo userInfo = new UserInfo(); //创建UserInfo实例
userInfo.setId(11112); //使之成为脱管状态
userInfo.setName("RW3");
userInfo.setSex("M");
UserInfo userInfo2 = new UserInfo(); //创建UserInfo实例
userInfo2.setId(11112); //使之成为脱管状态
userInfo2.setName("RW4");
userInfo2.setSex("F");
Session session = HibernateSessionFactory.currentSession(); //启动Session
Transaction tx = session.beginTransaction(); //启动事务
//调用merge方法,此时UserInfo实体状态并没有被持久化,但是数据库中的记录被更新了
session.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(); //提交事务
HibernateSessionFactory.closeSession(); //关闭Hibernate Session
}
针对该段代码将执行如下SQL语句:
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=?
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")的语句不会同步数据库中的表。
分享到:
相关推荐
VS线程附加调试工具、
在IT领域,尤其是在操作系统安全和身份验证方面,`pam_reattach`是一个非常重要的工具,特别是对于macOS用户。这个工具的主要功能是允许在验证过程(如使用Touch ID)后重新连接到用户的图形用户界面(GUI)会话。在...
理解并掌握Cadence原理图设计的基本流程和操作技巧对于电子工程师而言至关重要,它将直接影响电路设计的正确性和设计效率。对于初学者来说,通过本文的介绍,可以对Cadence原理图设计有一个初步的认识和了解,并为...
4. 使用Session对象执行CRUD操作,如:保存(save()或persist())、更新(update())、删除(delete())和查询(createQuery(), createSQLQuery()等)。 5. 提交事务并关闭Session。 **5. HQL(Hibernate Query ...
在Linux操作系统中,终端配置是每个用户日常工作中不可或缺的一部分,特别是对于系统管理员和开发者来说,一个定制化的终端环境可以极大地提高工作效率。"linux-st终端配置"这个主题主要涉及如何个性化和优化Linux...
- **自动恢复**:配置`tmux.conf`启用`reattach-to-user-namespace`以在系统重启后自动恢复session。 - **配色方案**:可以修改`tmux.conf`中的`status-left`和`status-right`以定制状态栏颜色和信息。 - **共享...
i3,Gnome和其他与操作系统相关的设置的。 安装脚本可用于Ubuntu OS。 Vim语言支持 去(好) R,Python (良好) 笔记 Tmux + Vim配置 tmux.conf进入~/.tmux.conf nvim/和fish/进入~/.config/(nvim|fish) 安装Tmux...
本文将详细介绍Maya中英文对照的关键术语,帮助用户更好地理解和操作这款软件。 一、动画模块(Animation) 1. Keys(关键帧):在时间线上设定的特定帧,用于记录对象的位置、旋转或缩放变化,是创建动画的基础。 ...
快速总结在旧版本的tmux下使用Mac OS X程序pbpaste和pbcopy可能无法正常工作。 其他服务和未打补丁的屏幕版本也会受到... make reattach-to-user-namespace && cp reattach-to-user-namespace ~/bin或者,您可以使用或
Firefox的VS Code调试... 您还可以在启动配置中将reAttach选项设置为true ,在这种情况下,Firefox不会在调试会话结束时终止,并且调试器将在您开始下一个调试会话时重新附加到它。比每次重新启动Firefox快得多。 reAt
这些是我的dotfile,我的配置,我想共享的shell主页。快速开始要启动并运行它,请先将其下拉到$ HOME中: $ git...powerline 在鱼中为复制reattach-to-user-namespace配置了reattach-to-user-namespace 命令描述ctrl +
之后,用户可以通过重新附加(reattach)来恢复这些会话。 3. **窗口和面板**:用户可以在一个会话中创建多个窗口,每个窗口可以进一步分割为多个面板,实现不同命令行界面的并排显示。 4. **键绑定定制**:`tmux`...
对于学习和使用Maya进行动画创作的用户来说,这份对照表能够提供直观的帮助,通过将英文菜单项翻译成中文,使得国内用户能够更快地熟悉和操作Maya软件中的各项功能。 ### 详细知识点解析 #### 动画(Animation) ...
这通常可以通过修改系统快捷键设置或者使用诸如`reattach-to-user-namespace`这样的工具来实现。 **使用技巧与快捷键** - 启动Vim-anywhere:按下你设定的快捷键,如`Alt+Shift+V`。 - 在Vim中编辑:进入插入模式...
在IT领域,".dotfiles" 是一个特殊的概念,它指的是用户自定义的配置文件,通常以点(.)开头,隐藏在操作系统中。这些文件用于存储个人化设置,如终端模拟器的主题、编辑器的配置、shell的启动脚本等。它们在用户的...
- **团队协作**:通过共享TMUX会话,团队成员可以协同查看和操作同一份代码或系统状态。 ### 总结 TMUX作为一个强大的终端多路复用器,提供了一种高效的工作环境,允许用户在同一窗口下管理多个shell会话,自定义...
以上知识点覆盖了Maya软件中动画、设置、骨骼系统、变形工具、皮肤绑定、几何体属性、帧操作、模拟与删除以及选择操作等方面的核心功能,为初学者提供了全面的指导,也适合进阶用户深入了解软件的高级特性。
Sal可能在dotfiles中包含了与iTerm2相关的配置,如颜色主题、热键设置,甚至可能使用了tmux或reattach-to-user-namespace工具来实现多窗口和会话管理。 `Vimscript`是Vim的脚本语言,用于编写Vim插件和配置文件。...
5. **安装系统实用工具**:例如reattach-to-user-namespace,使得tmux等工具能在SSH会话中正常工作。 Homebrew Shell脚本通常会以一种结构化的格式列出所有要安装的软件包,并逐个执行安装操作。例如: ```bash ...