Java SequenceGenerators名称在hibernate 5中是否全局唯一?
我正在从Hibernate4.3升级到5.2.13。我有一个模式,其中许多实体从一个本身带有注释的抽象类继承属性。例如: 实体A:Java SequenceGenerators名称在hibernate 5中是否全局唯一?,java,hibernate,jpa,hibernate-annotations,Java,Hibernate,Jpa,Hibernate Annotations,我正在从Hibernate4.3升级到5.2.13。我有一个模式,其中许多实体从一个本身带有注释的抽象类继承属性。例如: 实体A: @AttributeOverride(name = "id", column = @Column(name = "table_a_id")) @Entity @SequenceGenerator(name = "IdSequenceGenerator", sequenceName = "table_a_seq") @Table(name = "table_a") p
@AttributeOverride(name = "id", column = @Column(name = "table_a_id"))
@Entity
@SequenceGenerator(name = "IdSequenceGenerator", sequenceName = "table_a_seq")
@Table(name = "table_a")
public class EntityA extends Identity {
}
实体B:
@AttributeOverride(name = "id", column = @Column(name = "table_b_id"))
@Entity
@SequenceGenerator(name = "IdSequenceGenerator", sequenceName = "table_b_seq")
@Table(name = "table_b")
public class EntityB extends Identity {
}
父类:
@MappedSuperclass
public abstract class Identity {
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "IdSequenceGenerator")
public Long getId()
{
return id;
}
}
这在Hibernate4下运行正常,但我得到了下面的异常。由此,我假设序列生成器名称不需要全局唯一,但现在它是唯一的。是这样吗?有没有一种方法可以通过配置而不是更改许多实体来解决这个问题
我得到了这个错误:
Caused by: java.lang.IllegalArgumentException: Duplicate generator name IdSequenceGenerator
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addIdentifierGenerator(InFlightMetadataCollectorImpl.java:448)
at org.hibernate.cfg.AnnotationBinder.lambda$buildGenerators$0(AnnotationBinder.java:3369)
at java.util.HashMap.forEach(HashMap.java:1288)
at org.hibernate.cfg.AnnotationBinder.buildGenerators(AnnotationBinder.java:3368)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:728)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:249)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 54 more
感谢@maheshkumar。抄袭他的评论
序列生成器可以在实体类或主键字段或属性上指定。生成器名称的作用域对于持久性单元是全局的(跨所有生成器类型) 序列生成器可以在实体类或主键字段或属性上指定。生成器名称的作用域对于持久性单元是全局的(跨所有生成器类型)。