`
精神分裂
  • 浏览: 29629 次
  • 性别: Icon_minigender_1
  • 来自: 二次元世界
社区版块
存档分类
最新评论

Reattach和Merge操作的比较

阅读更多
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")的语句不会同步数据库中的表。
分享到:
评论

相关推荐

    ReAttach线程附加

    VS线程附加调试工具、

    pam_reattach:在验证过程中重新连接到macOS上的用户GUI会话(用于tmux中的Touch ID支持)

    在IT领域,尤其是在操作系统安全和身份验证方面,`pam_reattach`是一个非常重要的工具,特别是对于macOS用户。这个工具的主要功能是允许在验证过程(如使用Touch ID)后重新连接到用户的图形用户界面(GUI)会话。在...

    cadence原理图设计

    理解并掌握Cadence原理图设计的基本流程和操作技巧对于电子工程师而言至关重要,它将直接影响电路设计的正确性和设计效率。对于初学者来说,通过本文的介绍,可以对Cadence原理图设计有一个初步的认识和了解,并为...

    Hibernate例子

    4. 使用Session对象执行CRUD操作,如:保存(save()或persist())、更新(update())、删除(delete())和查询(createQuery(), createSQLQuery()等)。 5. 提交事务并关闭Session。 **5. HQL(Hibernate Query ...

    linux-st终端配置

    在Linux操作系统中,终端配置是每个用户日常工作中不可或缺的一部分,特别是对于系统管理员和开发者来说,一个定制化的终端环境可以极大地提高工作效率。"linux-st终端配置"这个主题主要涉及如何个性化和优化Linux...

    tmux使用(程序员适用)

    - **自动恢复**:配置`tmux.conf`启用`reattach-to-user-namespace`以在系统重启后自动恢复session。 - **配色方案**:可以修改`tmux.conf`中的`status-left`和`status-right`以定制状态栏颜色和信息。 - **共享...

    Dotfiles:我的[NeoVim + Tmux + Fish Shell]安装程序带有安装脚本

    i3,Gnome和其他与操作系统相关的设置的。 安装脚本可用于Ubuntu OS。 Vim语言支持 去(好) R,Python (良好) 笔记 Tmux + Vim配置 tmux.conf进入~/.tmux.conf nvim/和fish/进入~/.config/(nvim|fish) 安装Tmux...

    maya中英文对照.docx

    本文将详细介绍Maya中英文对照的关键术语,帮助用户更好地理解和操作这款软件。 一、动画模块(Animation) 1. Keys(关键帧):在时间线上设定的特定帧,用于记录对象的位置、旋转或缩放变化,是创建动画的基础。 ...

    tmux-MacOSX-pasteboard:在tmux会话中访问Mac OS X粘贴板的说明和解决方法。 注意:pu分支(“建议的更新”)可能会被撤消,恕不另行通知

    快速总结在旧版本的tmux下使用Mac OS X程序pbpaste和pbcopy可能无法正常工作。 其他服务和未打补丁的屏幕版本也会受到... make reattach-to-user-namespace && cp reattach-to-user-namespace ~/bin或者,您可以使用或

    vscode-firefox-debug:Firefox的VS Code调试适配器

    Firefox的VS Code调试... 您还可以在启动配置中将reAttach选项设置为true ,在这种情况下,Firefox不会在调试会话结束时终止,并且调试器将在您开始下一个调试会话时重新附加到它。比每次重新启动Firefox快得多。 reAt

    dotfiles:这些是我的dotfile,我的配置,我想共享的shell主页

    这些是我的dotfile,我的配置,我想共享的shell主页。快速开始要启动并运行它,请先将其下拉到$ HOME中: $ git...powerline 在鱼中为复制reattach-to-user-namespace配置了reattach-to-user-namespace 命令描述ctrl +

    tmux1.9 linux多屏管理软件

    之后,用户可以通过重新附加(reattach)来恢复这些会话。 3. **窗口和面板**:用户可以在一个会话中创建多个窗口,每个窗口可以进一步分割为多个面板,实现不同命令行界面的并排显示。 4. **键绑定定制**:`tmux`...

    maya动画英汉互译表

    对于学习和使用Maya进行动画创作的用户来说,这份对照表能够提供直观的帮助,通过将英文菜单项翻译成中文,使得国内用户能够更快地熟悉和操作Maya软件中的各项功能。 ### 详细知识点解析 #### 动画(Animation) ...

    vim-anywhere:在您一直想要的任何地方使用Vim

    这通常可以通过修改系统快捷键设置或者使用诸如`reattach-to-user-namespace`这样的工具来实现。 **使用技巧与快捷键** - 启动Vim-anywhere:按下你设定的快捷键,如`Alt+Shift+V`。 - 在Vim中编辑:进入插入模式...

    .dotfiles:点文件备份

    在IT领域,".dotfiles" 是一个特殊的概念,它指的是用户自定义的配置文件,通常以点(.)开头,隐藏在操作系统中。这些文件用于存储个人化设置,如终端模拟器的主题、编辑器的配置、shell的启动脚本等。它们在用户的...

    多路复用器

    - **团队协作**:通过共享TMUX会话,团队成员可以协同查看和操作同一份代码或系统状态。 ### 总结 TMUX作为一个强大的终端多路复用器,提供了一种高效的工作环境,允许用户在同一窗口下管理多个shell会话,自定义...

    maya中英文对照

    以上知识点覆盖了Maya软件中动画、设置、骨骼系统、变形工具、皮肤绑定、几何体属性、帧操作、模拟与删除以及选择操作等方面的核心功能,为初学者提供了全面的指导,也适合进阶用户深入了解软件的高级特性。

    dotfiles:Sal的dotfilesconfigs集合

    Sal可能在dotfiles中包含了与iTerm2相关的配置,如颜色主题、热键设置,甚至可能使用了tmux或reattach-to-user-namespace工具来实现多窗口和会话管理。 `Vimscript`是Vim的脚本语言,用于编写Vim插件和配置文件。...

    mac_os:用于自动设置macOS机器的Shell脚本

    5. **安装系统实用工具**:例如reattach-to-user-namespace,使得tmux等工具能在SSH会话中正常工作。 Homebrew Shell脚本通常会以一种结构化的格式列出所有要安装的软件包,并逐个执行安装操作。例如: ```bash ...

Global site tag (gtag.js) - Google Analytics