Hibernate迁移4.x到5.0.7.Final:框架使用Hibernate_序列而不是mySequence(使用Oracle和H2)
我已经将Hibrate版本从4.0.1.Final更新为5.0.7.Final(从JBoss7移植到Wildfly 10) 问题: hibernate框架使用hibernate_序列来生成id,而不是mySequence 休眠配置: 为了保持向后兼容性,hibernate.id.new_生成器_映射被配置为false值 实体配置: id字段使用以下JPA API进行注释: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
@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” 潜在解决方案:
@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