Java 有没有一种方法可以使用JPA注释和Hibernate动态选择@GeneratedValue策略?

Java 有没有一种方法可以使用JPA注释和Hibernate动态选择@GeneratedValue策略?,java,database,hibernate,jpa,Java,Database,Hibernate,Jpa,我正在开发一款支持多个数据库引擎(Oracle、MSSQL、MySQL)的产品。对于Oracle,我更喜欢使用序列而不是序列表,以避免在大容量安装中出现潜在的并发和锁定问题,但其他数据库引擎不支持序列。此外,我更希望每个表使用一个序列,而不是全局序列(例如hibernate\u sequence),因此@GeneratedValue(strategy=GenerationType.AUTO)不起作用。有没有办法在运行时动态选择策略?实际上,Hibernate使用其org.Hibernate.id

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

实际上,Hibernate使用其
org.Hibernate.id.enhanced.SequenceStyleGenerator
解释
GenerationType.AUTO
GenerationType.SEQUENCE
。SequenceStyleGenerator是一种id生成策略,它根据底层数据库支持的内容从两种策略中选择一种。如果数据库支持序列,SequenceStyleGenerator使用序列;如果没有,SequenceStyleGenerator将返回使用“序列表”。要使用哪个生成器的“映射”由设置控制:
hibernate.id.new\u generator\u mappings
。将其设置为true将启用我刚才描述的行为。不幸的是,出于向后兼容性的原因,我们不得不将其默认为false。因此,要利用这一点,您需要确保将该设置设置为true

此外,如果没有给出名称,您可以将SequenceStyleGenerator配置为首选全局序列或每个实体的序列。这由名为“每个实体首选序列”的设置控制


SequenceStyleGenerator通常是可配置的。查看其javadocs以了解更多信息:

它是如何配置的,我还没有找到一个如何更改SequenceStyleGenerator的增量大小的示例?传递给configure方法的参数是cfg.xml中设置的有限属性集。优化器和增量大小没有尽我最大的努力传递。
@SequenceGenerator(…,allocationSize=blah)
谢谢你的建议。但这似乎是一条捷径,因为SequenceGenerator没有SequenceStyleGenerator中提到的相同配置属性。我尝试了这个,它与池优化器一起工作,它给了我预期的性能优势。但是为了结束。在cfg.xml文件中是否有这样做的方法。在调试SequenceStyleGenerator.java时,hibernate没有读取SequenceStyleGenerator.java上的“optimizer”和“increment_size”。仅使用
strategy=sequence
+
@SequenceGenerator
时,如何将
preference\u sequence\u per_entity
参数传递给
SequenceStyleGenerator
?还有什么比回到
@GeneratedValue(generator=“mygen”)
然后
@GenericGenerator(name=“mygen”,strategy=“org.hibernate.id.enhanced.SequenceStyleGenerator”,parameters=…)
?从hibernate 5开始,“hibernate.id.new_generator_mappings”默认设置为true: