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

时间:2012-10-04 22:43:42

标签: java database hibernate jpa

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

1 个答案:

答案 0 :(得分:31)

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

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

的设置控制

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