SequenceGenerators在hibernate 5中的名称是全局唯一的吗?

时间:2018-04-09 23:17:48

标签: java hibernate jpa hibernate-annotations

我正在从Hibernate 4.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")
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;
    }
}

这在Hibernate 4下运行正常,但是我得到了以下异常。通过这个,我假设序列生成器名称不需要是全局唯一的,但现在它是。是这样的吗?有没有办法可以用配置解决这个问题,而不是改变很多(很多)实体?

我收到此错误:

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

1 个答案:

答案 0 :(得分:0)

感谢@maheshkumar。复制他的评论。

可以在实体类或主键字段或属性上指定序列生成器。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。

相关问题