重复生成器序列在子类上休眠

Bru*_*tti 3 java hibernate jpa

我按照这篇文章来解决我最初的问题: 在子类的 Hibernate 中指定每个表的不同序列

但现在我得到一个例外:

init 方法调用失败;嵌套异常是 java.lang.IllegalArgumentException: Duplicate generator name idgen

在我的类、子类和 pom.xml 下面:

EntityId(抽象类)

@MappedSuperclass
public abstract class EntityId<T extends Serializable> implements Serializable {

    private static final long serialVersionUID = 1974679434867091670L;

    @Id
    @GeneratedValue(generator="idgen", strategy=GenerationType.SEQUENCE)
    @Column(name="id")
    protected T id;

    public T getId() {
        return id;
    }

    public void setId(T id) {
        this.id = id;
    }

}
Run Code Online (Sandbox Code Playgroud)

类别类

@Entity
@SequenceGenerator(name="idgen", sequenceName="cat_id_seq", allocationSize=1)
@AttributeOverrides({
    @AttributeOverride(name="id", column = @Column(name="cat_id"))
})
@Table(name="categoria")
public class Category extends EntityId<Integer> {

    private static final long serialVersionUID = -870288485902136248L;

    @Column(name="name")
    private String name;

    @Column(name="description")
    private String description;

}
Run Code Online (Sandbox Code Playgroud)

pom.xml

...
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.15.Final</version>
</dependency>
...
Run Code Online (Sandbox Code Playgroud)

我的问题与这篇文章类似:https : //hibernate.atlassian.net/browse/HHH-12329

uli*_*uli 6

从您提供的链接。JPA 规范说:

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

因此,拥有两个名称相同但配置不同的标识符生成器是不合法的。范围是全局的,而不是实体。

要解决您的问题,您应该将 @Id 从 @MappedSuperclass 推送到子类中。

更多细节


编辑,添加了可能的解决方法:

  • 从超类中的字段中删除注释;
  • 使吸气剂抽象;
  • 让所有的子类都有自己的序列生成器:所有的生成器都应该有全局唯一的名字;
  • 实现吸气剂;
  • 在 getter 上移动与 Id 字段相关的注释。

public interface EntityId<T extends Serializable> extends Serializable {

    public T getId();

    public void setId(T id);

}

@Entity
@Table(name="categoria")
public class Category implements EntityId<Integer> {

    private static final long serialVersionUID = -870288485902136248L;

    @Id
    @Column(name="cat_id")
    @SequenceGenerator(name="cat_id_gen", sequenceName="categoria_cat_id_seq", allocationSize=1)
    @GeneratedValue(generator="cat_id_gen", strategy=GenerationType.SEQUENCE)
    private Integer id;

    //others attributes here...

    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public Integer getId() {
        return this.id;
    }

}
Run Code Online (Sandbox Code Playgroud)