Hibernate迁移4.x到5.0.7.Final:框架使用Hibernate_序列而不是mySequence(使用Oracle和H2)

Hibernate迁移4.x到5.0.7.Final:框架使用Hibernate_序列而不是mySequence(使用Oracle和H2),hibernate,jpa,wildfly,sequence-generators,Hibernate,Jpa,Wildfly,Sequence Generators,我已经将Hibrate版本从4.0.1.Final更新为5.0.7.Final(从JBoss7移植到Wildfly 10) 问题: hibernate框架使用hibernate_序列来生成id,而不是mySequence 休眠配置: 为了保持向后兼容性,hibernate.id.new_生成器_映射被配置为false值 实体配置: id字段使用以下JPA API进行注释: @Id @GeneratedValue(strategy = GenerationType.AUTO, generator

我已经将Hibrate版本从4.0.1.Final更新为5.0.7.Final(从JBoss7移植到Wildfly 10)

问题: hibernate框架使用hibernate_序列来生成id,而不是mySequence

休眠配置: 为了保持向后兼容性,hibernate.id.new_生成器_映射被配置为false值

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "myGenerator")
@SequenceGenerator(name = "myGenerator", sequenceName = "MY_GENERATOR_SEQ")
@Column(name="ID")
private Long id;
DB配置: MY_GENERATOR_SEQ序列由“增量1”选项定义

H2和Oracle DB都会出现问题

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


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

潜在解决方案:

  • set on SequenceGenerator allocationSize=1(不设置hibernate.id.new_generator_mappings=false)
  • 在数据库上创建序列MY_GENERATOR_SEQ,增量为50(不设置hibernate.id.new_GENERATOR_mappings=false)
  • 这两种解决方案都不适用于我的环境。 因此,唯一适用的“解决方案”是: 扩展用于Oracle和H2的方言,并通过以下方式重写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;
        }
      }
    
    并在org.springframework.orm.jpa.vendor.hibernatejbavendorapter上用ah hoc方言明显设置“数据库平台”


    还提交给hibernate comunity:

    您是否尝试使用
    策略=生成类型.SEQUENCE
    而不是
    AUTO
    不幸的是,问题与无法在我的上下文中更新实体类密切相关,事实上,如潜在解决方案1或2中所述,更改实体是可行的。hibernate comunity已经确认了该错误,感谢更新+1