我有一个带有 @Version 字段的 JPA 实体类,用于乐观锁定。我需要merge()
一个分离的实体实例,它的版本字段未在持久化上下文中的现有实体实例上初始化。执行此操作时,托管实例的版本字段将被覆盖,这会导致稍后出现 OptimisticLockException。
我可以在合并之前手动将版本字段的内容从托管实体复制到分离实体,但我觉得这有点尴尬。是否有更好的选择或最佳实践来处理这种情况?
最佳答案
如果版本字段未初始化,则合并将不起作用。它必须在那里。 JPA 提供程序必须将您尝试合并的实体的版本字段与数据库中的版本进行比较。如果实体版本比数据库中的旧,那么它将不得不抛出异常。
您可以做的不是进行合并,而是通过 JPA 查询使用更新:
Query q = em.createQuery("UPDATE MyEntity me SET me.versionField = me.versionField + 1....");
q.executeUpdate();
您可以在此查询中设置实体的其他字段,但重要的是您必须显式增加 version 字段的值。版本字段不会在通过查询更新时自动增加。
关于java - 将分离的 JPA 实体与 @version 字段合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324097/