我正在编写一个系统,该系统包含一个名为 Voucher
的 hibernate 管理实体,该实体有一个名为 serialNumber
的字段,该字段包含唯一存在的 有效副本。数据库表中也可能存在旧的无效副本,这意味着数据库字段可能未声明为唯一。
保存新的有效凭证实例(需要新的序列号)的操作首先在适当的实体上同步。此后,整个过程被封装在一个事务中,新值由 JPQL 获取
SELECT MAX(serialNumber) + 1 FROM Voucher
字段从查询中获取结果,此后保存实例,刷新 session ,提交事务,代码最终离开同步块(synchronized block)。
尽管如此,数据库有时(如果很少)最终会出现带有重复序列号的优惠券。
我的问题是:考虑到我对同步和事务处理相当有信心,是否有任何明显的事情我应该了解我错过的 hibernate ,或者我应该返回到另一个调试 session ,尝试找到导致问题的其他原因吗?
运行保存进程的服务是一个运行在tomcat6上的Web应用程序,由Spring的HttpRequestHandlerServlet
管理。数据库连接由 C3P0 汇集,运行非常基于默认的配置。
我很感激任何建议
谢谢
最佳答案
您可以使用 MultipleHiLoPerTableGenerator :它在当前事务之外生成@Id
。
关于java - 确保 Hibernate session 中的唯一序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783289/