【发布时间】:2011-03-15 18:43:52
【问题描述】:
我有以下几种用于休眠实体层次结构的类。我试图有两个具体的子类Sub1Class 和Sub2Class。它们由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 的断言错误:它不喜欢一个类既是实体又是映射的超类。如果我从EntitySuperClass 中删除@Entity,则该类不再是实体并且不能被其他实体引用:
MappedSuperClass 是外部包的一部分,所以如果可能的话不应该改变它。
我的课:
@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;
}
}
【问题讨论】:
-
但是为什么要暴露鉴别器列呢?此列通常是您不想公开的“隐藏”实现细节。
-
鉴别器列已经暴露在 MappedSuperClass 中,它是外部包的一部分。如果可能的话,我想避免修改的包。
标签: java hibernate single-table-inheritance