一尘不染

有没有一种方法可以使用JPA批注和Hibernate动态选择@GeneratedValue策略?

hibernate

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


阅读 244

收藏
2020-06-20

共1个答案

一尘不染

实际上,Hibernate会同时解释GenerationType.AUTOGenerationType.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

2020-06-20