在我的应用程序中,我正在为发票建模。在我国(意大利),每张发票必须有一个唯一的无序列号,每年必须从1重新开始。
我对实现它的最佳方法进行了漫长而艰辛的思考,但是我还没有找到一个很好的指南。现在,我有一个JpaRepository
自定义的同步save()
方法,在该方法中,我可以获取最后使用的ID:
SELECT MAX(numero) FROM Invoice WHERE YEAR(date) = :year
这种方法的问题是不是很安全,因为开发人员应该知道仅应使用该特定服务进行保存。
相反,我想要更多对开发人员隐藏的方法。我想在中使用一种@Prepersist
方法@EntityListeners
。听起来不错,但是在此类中获取实体管理器并不是那么简单....所以可能不是最佳位置…
最后我想到了hibernate拦截器。
请给我一些提示。这个问题似乎是一个非常普遍的问题。因此,也许还有一个好的做法可以遵循。
谢谢
此问题可以分解为以下要求:
1000001
)开始按顺序生成数字,然后始终以固定值(例如1
)递增。1000001
,增量为,1
并且到目前为止已生成200个数字,则最新的数字应为1000201
。任何解决方案都只能满足这5个要求中的4个。例如,如果要保证1-4,则每个进程都将需要加锁,以便其他进程无法生成并使用与其生成的相同编号。因此,将1-4强加为要求将意味着必须放弃5。同样,如果要保证1、2、4和5,则需要确保一次仅一个进程(线程)一次生成一个数字,因为在没有锁定的并发环境中无法保证唯一性。继续这种逻辑,您将了解为什么不可能同时保证所有这些要求。
现在,解决方案取决于您愿意牺牲1-5个中的哪一个。如果您愿意牺牲#4而不是#5,则可以在空闲时间运行批处理以生成数字。但是,如果您将此列表放在业务用户(或财务人员)面前,他们将要求您遵守1-4,因为#5对他们来说纯粹是技术问题,因此他们不希望成为困扰着它。如果是这样,可能的策略是:
DOCUMENT_SEQUENCE
)来跟踪最后生成的数字。SERIALIZABLE
),找到要使用的所需序列值并立即保存发票。这应该不会花费太多时间,因为读取一行,增加其值并保存一条记录应该足够短。如果可能的话,使此短事务成为主事务的嵌套事务。SERIALIZABLE
锁定的并发线程不会太快超时。除此之外,如果可能并在数据库设计准则允许的范围内,请在发票编号列上设置唯一的约束,以使重复的值不会被花费任何费用。
Spring为您提供了实现此目标的所有工具。
@Transactional
注释。isolation
属性@Transactional
。我有一个示例应用程序,演示了如何将所有这些部分一起使用。
我在尝试将HiberNate与SAP HANA In-Memory数据库连接时遇到了一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将HiberNate设置为使用序列生成ID。 但是当我插入大量记录(例如,40000)时,Hibernate首先会生成ID。它看起来像: 只有在生成所有 ID 后,它才会开始实际
我一整天都在尝试从JPA/Hibernate的Postgres获取序列,但它给了我所有的时间: 信息:Hibernate:调用tb_cdr_id_seq的下一个值警告:SQL错误: 0,SQLState: 42601错误:错误:语法错误在或附近“调用”严重:javax.persistence.持久性异常:org.hibernate.exception.SQLGrammar异常:无法提取结果集 Po
问题内容: 我正在使用oracle 11g,Java(struts2)和Hibernate开发应用程序。 我有一个名为mytemp的表,其列mytemp_id为NUMBER(22,0)类型。 在我的mytemp.hbm.xml文件中,ID如下所示 在我的Oracle数据库中,创建了名为“ MYTEMP_TEMP_ID_SEQ”的序列,并在Oracle中正常工作。 现在,当我尝试使用hibernat
我使用以下命令创建了一个名为hibernate_sequence的序列 这是我的hibernate注释dao 为了向表中插入新记录,hibernate正在生成错误的查询以获取下一个序列值。。Hibernate总是发出此查询。。不管我做什么。。 我使用的是oracle 10G,它总是报告以下错误。。 发出的查询应该是
问题内容: 我有一个具有以下定义的类: 当我们在Jboss 4.2.3上运行它时,它可以正常工作并生成正确的ID(从1000+开始) 现在我们转到jboss 7.1.1,它会生成负ID!(从-498开始,然后上升) 知道为什么会发生这种情况吗? 问题答案: 从JBoss 6.1迁移到JBoss 7.1时遇到了这个问题。 根据JBoss AS 7.1 JPA文档(https://docs.jboss