我正在工作的产品,将支持多个数据库引擎(甲骨文,微软will,MySQL)。对于Oracle,我更喜欢使用序列而不是顺序表,以避免在大容量安装时可能出现的并发和锁定问题,但其他数据库引擎不支持序列。此外,我更喜欢在每个表中使用一个序列,而不是全局序列(例如hibernate_sequence),因此@GeneratedValue(strategy = GenerationType.AUTO)将不起作用。有没有办法在运行时动态选择策略?
发布于 2012-10-05 09:18:29
实际上,Hibernate使用它的org.hibernate.id.enhanced.SequenceStyleGenerator解释GenerationType.AUTO和GenerationType.SEQUENCE。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
https://stackoverflow.com/questions/12737092
复制相似问题