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