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

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

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

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

SequenceStyleGenerator通常是可配置的。 有关更多信息,请查看其javadocs: http ://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/ SequenceStyleGenerator.html