JPA中的唯一ID(多租户)

时间:2011-09-20 14:57:25

标签: jpa multi-tenant

我目前正在开发一个使用JPA(Hibernate)的多租户应用程序。对于某些表,我需要一个对每个租户都唯一的序列号。因此,我无法将@GeneratedValue用于这些字段。我决定使用一个名为Sequence的额外实体,其中long字段用@Version注释。请求新ID时,我会执行以下操作:

Sequence seq = em.find(Sequence.class, pk, LockModeType.PESSIMISTIC_FORCE_INCREMENT);
long nextId = seq.id;

只要我不运行两次应用程序,这就有效。然后我得到以下异常:

  

线程“main”中的异常javax.persistence.OptimisticLockException:   org.hibernate.StaleObjectStateException:行已更新或删除   另一个事务(或未保存的值映射不正确)

序列没有“正确”锁定,我一提交就得到一个例外。我之前无法检测到它,因为JPA不支持嵌套事务。我尝试了其他一些东西,但也失败了。

那么,是否有其他(便携式)解决方案允许我在多租户环境中生成唯一密钥?

1 个答案:

答案 0 :(得分:0)

您没有正确使用@Version注释。此注释将数字字段设计为版本字段,并在执行事务锁时由JPA在内部使用。你不应该写或甚至(除了某些情况)阅读它。你的初衷是正确的:制作一个音序器,但你不需要使用@Version。只需要一个带有原子整数的类,每当你需要一个新的唯一值时,该整数就会递增,然后在表中持久保存到db。