【发布时间】:2014-12-23 09:19:28
【问题描述】:
我需要对某些表 ID 进行无间隙序列,因此我创建了序列表,尽量避免在每次插入时选择 Max,总计数将用于其他任务
@Id
@TableGenerator(name="ProcedureTypeIdGen", table="REF_SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="SEQ_PROCEDURE_TYPE", allocationSize=1, initialValue=0)
@GeneratedValue(strategy=GenerationType.TABLE, generator="ProcedureTypeIdGen")
@Column(name="PROCEDURE_TYPE_ID")
private Long id;
但是每次我向PROCEDURE_TYPE插入一个值时,序列值总是递增,尽管事务回滚了,因为一个异常并且PROCEDURE_TYPE表中没有插入任何数据!
【问题讨论】:
-
一个序列表被多个 EntityManagers 使用,因此使用它自己的独立 Connection 比锁定所有 EntityManagers 直到每个 EntityManagers 都被提交更有意义
-
在可能的情况下会有一个 EntityManager,并且如果稍后添加任何一个(任何其他模块),则此模块不应使用此表,并且其他模块也不应将数据插入这些表中,也插入此表应该是在非常罕见的情况下
-
一些 JPA 实现允许控制它是否将使用与 EntityManager 相同的连接(例如,我使用的 DataNucleus JPA)。你的可能没有