我正在开发一种将支持多个数据库引擎(Oracle、MSSQL、MySQL)的产品。对于 Oracle,我更喜欢使用序列而不是序列表来避免大容量安装中潜在的并发和锁定问题,但其他数据库引擎不支持序列。此外,我更喜欢每个表使用一个序列而不是全局序列(例如hibernate_sequence
),所以@GeneratedValue(strategy = GenerationType.AUTO)
不会工作。有没有办法在运行时动态选择策略?
1 回答
实际上,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 通常是相当可配置的。查看它的 javadocs 以获取更多信息:http ://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html