Hibernate Migration 4.x到5.0.7.Final:框架使用hibernate_sequence而不是mySequence(使用Oracle和H2)

时间:2016-03-29 10:49:26

标签: hibernate jpa wildfly sequence-generators

我已将hiberate版本从4.0.1.Final更新为5.0.7.Final(从Jboss 7移植到Wildfly 10)。

问题: hibernate框架使用hibernate_sequence来生成id而不是mySequence。

Hibernate配置: 为了保持向后兼容性,hibernate.id.new_generator_mappings被配置为false值。

实体配置: id字段使用以下JPA API注释:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "myGenerator")
@SequenceGenerator(name = "myGenerator", sequenceName = "MY_GENERATOR_SEQ")
@Column(name="ID")
private Long id;

数据库配置: MY_GENERATOR_SEQ序列由" INCREMENT BY 1"定义。选项。

H2和Oracle DB都会出现问题。

  

问题我已经分析了实现,我不知道它是否可能是Hibernate的BUG或者我为后向兼容性做的任何可能的错误配置???

分析: 服务器启动期间的Hibernate会进行一些初始化: SequenceStyleGenerator.configure方法将QualifiedName sequenceName定义为" hibernate_sequence",因为它试图从Properties参数中获取值。 此时我注意到MY_GENERATOR_SEQ sequenceName在运行时使用"序列"存在于属性参数中。 key(sequence = MY_GENERATOR_SEQ)但检索策略(determineSequenceName)需要" sequence_name"作为关键。 因此,用于将序列名称设置为Properties参数的密钥来自已弃用的类org.hibernate.id.SequenceGenerator.SEQUENCE,因为hibernate.id.new_generator_mappings = false, 但是SequenceStyleGenerator类需要org.hibernate.id.enhanced.SequenceStyleGenerator.SEQUENCE_PARAM键才能获得" MY_GENERATOR_SEQ"。

潜在解决方案:

  1. 在SequenceGenerator上设置allocationSize = 1(不设置hibernate.id.new_generator_mappings = false)
  2. 使用INCREMENT BY 50在DB上创建序列MY_GENERATOR_SEQ(不设置hibernate.id.new_generator_mappings = false)
  3. 这两种解决方案都不适用于我的上下文。 所以唯一适用的解决方案"就是这个: 扩展用于Oracle和H2的Dialect,并以这种方式覆盖getNativeIdentifierGeneratorClass方法:

    @Override
    public Class getNativeIdentifierGeneratorClass() {
        if ( getIdentityColumnSupport().supportsIdentityColumns() ) {
          return IdentityGenerator.class;
        }
        else {
            //From hibernate-core 5.0.7.Final, org.hibernate.dialect.Dialect
            //the original return value was org.hibernate.id.enhanced.SequenceStyleGenerator.class
          return SequenceGenerator.class;
        }
      }
    

    并且明确地设置了" databasePlatform"使用ah-hoc方言在org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter上。

    还提交给hibernate社区:https://hibernate.atlassian.net/browse/HHH-10656

0 个答案:

没有答案