java - 将分离的 JPA 实体与 @version 字段合并

标签 java jpa

我有一个带有 @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/

相关文章:

java - hibernate 、@SequenceGenerator 和 allocationSize

java - 使用 REST API 创建新站点

java - 不完整的 WSDL - 帐户类缺少与自定义对象的子关系

java - 在二叉搜索树中声明学生名册时出现 ExceptionInInitialize 错误

java - Hibernate 和 MySQL 超出锁定等待超时(使用 Play Framework )

java - 如何生成 JPA 实体元模型?

Java 应用程序 - 添加、删除、重新排序 JButton 的元素

java - Thymeleaf 中的百分比计算 - 结果为零

java - Hibernate一对一关系和外键问题

java - 如何编写参数为集合的 JPA 查询?