有没有办法使用JPA注释和Hibernate动态选择@GeneratedValue策略?

2022-09-02 09:17:25

我正在开发一种支持多个数据库引擎(Oracle,MSSQL,MySQL)的产品。对于 Oracle,我更喜欢使用序列而不是序列表,以避免在大容量安装中出现潜在的并发和锁定问题,但其他数据库引擎不支持序列。此外,我更喜欢每个表使用一个序列,而不是全局序列(例如),因此不起作用。有没有办法在运行时动态选择策略?hibernate_sequence@GeneratedValue(strategy = GenerationType.AUTO)


答案 1

实际上,Hibernate解释两者并使用其.SequenceStyleGenerator 是一种 id 生成策略,它根据基础数据库支持的内容从两个策略中选择一个。如果数据库支持序列,则 SequenceStyleGenerator 使用序列;如果没有,SequenceStyleGenerator将回退到使用“序列表”。使用哪个生成器的“映射”由一个设置控制:。将其设置为 true 将启用我上面描述的行为。不幸的是,出于向后兼容性的原因,我们不得不将其默认为 false。因此,要利用这一点,您需要确保将该设置设置为 true。GenerationType.AUTOGenerationType.SEQUENCEorg.hibernate.id.enhanced.SequenceStyleGeneratorhibernate.id.new_generator_mappings

此外,可以将 SequenceStyleGenerator 配置为首选全局序列或每个实体的序列(如果未指定名称)。这由名为prefer_sequence_per_entity

SequenceStyleGenerator通常是相当可配置的。看看它的javadocs以获取更多信息:http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html


答案 2

推荐