使用@version字段

时间:2015-10-24 22:37:43

标签: java jpa

我有一个带有@Version字段的JPA实体类,用于乐观锁定。我需要merge()一个分离的实体实例,它的版本字段在持久化上下文中的现有实体实例上未初始化。执行此操作时,托管实例的版本字段将被覆盖,这将导致稍后的OptimisticLockException。

我可以在合并之前手动将版本字段的内容从托管实体复制到分离实体,但我觉得这有点尴尬。是否有更好的选择或最佳实践来处理这种情况?

1 个答案:

答案 0 :(得分:0)

如果您的版本字段未初始化,则无法执行合并。它必须在那里。 JPA提供程序必须将您尝试合并的实体的版本字段与数据库中的版本进行比较。如果实体版本比数据库中的版本旧,则必须抛出异常。

你可以做什么而不是合并,是通过JPA查询使用更新:

Query q = em.createQuery("UPDATE MyEntity me SET me.versionField = me.versionField + 1....");
q.executeUpdate();

您可以在此查询中设置实体的其他字段,但重要的是您必须显式增加版本字段的值。版本字段不会通过查询自动递增。