【发布时间】:2011-09-20 23:05:52
【问题描述】:
我目前正在开发一个使用 JPA (Hibernate) 的多租户应用程序。对于某些表,我需要一个对每个租户都是唯一的序列号。因此,我不能将@GeneratedValue 用于这些字段。我决定使用一个名为 Sequence 的额外实体,该实体带有一个带有 @Version 注释的 long 字段。请求新 ID 时,我执行以下操作:
Sequence seq = em.find(Sequence.class, pk, LockModeType.PESSIMISTIC_FORCE_INCREMENT);
long nextId = seq.id;
只要我不运行应用程序两次,它就可以工作。然后我得到以下异常:
线程“主”javax.persistence.OptimisticLockException 中的异常: org.hibernate.StaleObjectStateException:行被更新或删除 另一笔交易(或未保存值映射不正确)
序列没有被“正确”锁定,我一提交就得到一个异常。由于 JPA 不支持嵌套事务,因此我无法更早地检测到它。我尝试了其他一些方法,但也失败了。
那么,是否有任何其他(便携式)解决方案可以让我在多租户上下文中生成唯一密钥?
【问题讨论】:
标签: jpa multi-tenant