Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 避免'的最佳实践;具有相同标识符值的不同对象已与会话关联';_Hibernate_Jpa - Fatal编程技术网

Hibernate 避免'的最佳实践;具有相同标识符值的不同对象已与会话关联';

Hibernate 避免'的最佳实践;具有相同标识符值的不同对象已与会话关联';,hibernate,jpa,Hibernate,Jpa,我认为这是一个常见的程序 通过hibernate加载实体 将其存储在会话变量中 改变属性 以后保存 当当前会话已在任何情况下加载对象时,有什么常见做法可以避免错误具有相同标识符值的不同对象已与会话关联 使用合并 避免在之前加载同一对象 刷新hibernate会话并分离其他实例 从会话中检索对象,是否手动复制会话中实例的更改 是否使用DTO并仅将id存储在会话处理程序中 还有其他想法吗 我想最佳实践是非常固执己见的。最后,您必须选择最适合您的用例的方法。我个人使用了以下方法: 使用Enti

我认为这是一个常见的程序

  • 通过hibernate加载实体
  • 将其存储在会话变量中
  • 改变属性
  • 以后保存
当当前会话已在任何情况下加载对象时,有什么常见做法可以避免错误
具有相同标识符值的不同对象已与会话关联

  • 使用合并
  • 避免在之前加载同一对象
  • 刷新hibernate会话并分离其他实例
  • 从会话中检索对象,是否手动复制会话中实例的更改
  • 是否使用DTO并仅将id存储在会话处理程序中
  • 还有其他想法吗

    • 我想最佳实践是非常固执己见的。最后,您必须选择最适合您的用例的方法。我个人使用了以下方法:

      • 使用
        EntityManager.merge
        -它工作起来很简单,但您必须在要合并的关联上正确配置
        CascadeType.merge
        ,或者单独进行合并。但这可能不适合所有用例,并导致大量更新
      • 从会话中获取当前对象并应用更改-如果我想完全控制可以更改的内容,并在看到某些属性值更改时触发一些其他更改,我通常会这样做,但编写的代码相当繁琐
      • 使用DTO-这类似于“从会话获取当前对象并应用更改”,因为您必须以某种方式将DTO映射到实体
      话虽如此,我更喜欢使用DTO方法,但它支持脏跟踪,只更新真正改变的内容

      我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型

      有关这方面的更多信息,请参阅文档:


      默认的刷新策略使用DML查询,因此除了持久化对象外,没有与持久化上下文/会话的交互,但是还有一种实体刷新策略,如果需要,可以通过更改持久化上下文中的对象来工作。

      这是否回答了您的问题?我知道问题是什么,我只想知道Web应用程序是否有一个共同的模式来避免这个问题