我按照这篇文章来解决我最初的问题:在 Hibernate 中的子类上指定每个表的不同序列
但现在我得到一个例外:
调用init方法失败;嵌套异常是
java.lang.IllegalArgumentException:重复的生成器名称 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;
}
}
类别类
@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;
}
pom.xml
...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.15.Final</version>
</dependency>
...
我的问题与这篇文章类似:https://hibernate.atlassian.net/browse/HHH-12329
从您提供的链接。 JPA 规范指出:
序列生成器可以在实体类或
主键字段或属性。生成器名称的范围是
持久性单元的全局性(跨所有生成器类型)。
因此,拥有两个具有相同名称和不同配置的标识符生成器是不合法的。范围是全局的,不是实体的。
要解决您的问题,您应该将 @Id 从 @MappedSuperclass 推送到子类中。
更多细节
编辑,添加了可能的解决方法:
- 从超类中的字段中删除注释;
- 让 getter 变得抽象;
- 让所有子类都有自己的序列生成器:所有生成器都应该有全局唯一的名称;
- 实现吸气剂;
- 将与 Id 字段相关的注释移到 getter 上。
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)