gpt4 book ai didi

java - Hibernate,单表继承和使用父类(super class)字段作为鉴别器列

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:08 25 4
gpt4 key购买 nike

我有以下几种用于 hibernate 实体层次结构的类。我正在尝试拥有两个具体的子类 Sub1ClassSub2Class。它们由 MappedSuperClass 中定义的鉴别器列(field)分隔。有一个抽象实体类 EntitySuperClass 被其他实体引用。其他实体不应该关心它们实际上是在引用 Sub1Class 还是 Sub2Class

这真的可能吗?目前我收到此错误(因为列定义在 Sub1Class 和 EntitySuperClass 中被继承了两次):

Repeated column in mapping for entity: my.package.Sub1Class column: field (should be mapped with insert="false" update="false")

如果我将 @MappedSuperClass 添加到 EntitySuperClass,那么我会从 hiberante 得到断言错误:如果一个类既是 Entity 又是映射的父类(super class),它不喜欢。如果我从 EntitySuperClass 中删除 @Entity,则该类不再是实体并且不能从其他实体引用:

MappedSuperClass 是外部包的一部分,因此如果可能,不应更改它。

我的类(class):

@MappedSuperclass
public class MappedSuperClass {
private static final String ID_SEQ = "dummy_id_seq";
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ)
@GenericGenerator(name=ID_SEQ, strategy="sequence")

@Column(name = "id", unique = true, nullable = false, insertable = true, updatable = false)
private Integer id;

@Column(name="field", nullable=false, length=8)
private String field;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}


@Entity
@Table(name = "ACTOR")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="field", discriminatorType=DiscriminatorType.STRING)
abstract public class EntitySuperClass extends MappedSuperClass {


@Column(name="description", nullable=false, length=8)
private String description;

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}

@Entity
@DiscriminatorValue("sub1")
public class Sub1Class extends EntitySuperClass {

}


@Entity
@DiscriminatorValue("sub2")
public class Sub2Class extends EntitySuperClass {

}


@Entity
public class ReferencingEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;

@Column
private Integer value;

@ManyToOne
private EntitySuperClass entitySuperClass;


public Integer getId() {
return id;
}

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

public Integer getValue() {
return value;
}

public void setValue(Integer value) {
this.value = value;
}

public EntitySuperClass getEntitySuperClass() {
return entitySuperClass;
}

public void setEntitySuperClass(EntitySuperClass entitySuperClass) {
this.entitySuperClass = entitySuperClass;
}

}

最佳答案

在我的项目中是这样完成的:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "field", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("dummy")
public class EntitySuperClass {
// here definitions go
// but don't define discriminator column here
}

@Entity
@DiscriminatorValue(value="sub1")
public class Sub1Class extends EntitySuperClass {
// here definitions go
}

而且它有效。我认为您的问题是您在父类(super class)定义中不必要地定义了鉴别器字段。删除它,它将起作用。

关于java - Hibernate,单表继承和使用父类(super class)字段作为鉴别器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3245142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com