Ich habe folgende Arten von Klassen für Hibernate Entity-Hierarchie. Ich versuche, zwei konkrete Unterklassen und Sub2Class
zu haben. Sie sind durch eine Diskriminatorsäule (field
) getrennt, die in MappedSuperClass
definiert ist. Es gibt eine abstrakte Entitätsklasse EntitySuperClass
, auf die von anderen Entitäten verwiesen wird. Die anderen Entitäten sollten sich nicht darum kümmern, ob sie tatsächlich auf oder Sub2Class
verweisen.Hibernate, Vererbung einzelner Tabellen und Verwendung von Feld aus der Oberklasse als Diskriminatorspalte
Ist das tatsächlich möglich? Derzeit bekomme ich diesen Fehler (weil Spaltendefinition zweimal in Sub1Class vererbt wird und in EntitySuperClass):
Repeated column in mapping for entity: my.package.Sub1Class column: field (should be mapped with insert="false" update="false")
Wenn ich @MappedSuperClass
zu EntitySuperClass
hinzufügen, dann bekomme ich Assertionsfehler von hiberante: es nicht mag, wenn eine Klasse beides Entity und eine zugeordnete Superklasse. Wenn ich @Entity
von EntitySuperClass
zu entfernen, ist die Klasse nicht mehr Einheit und kann nicht von anderen Einrichtungen verwiesen werden:
MappedSuperClass
ein Teil der Umverpackung ist, so dass, wenn möglich, sollte nicht verändert werden.
Meine Klassen:
@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;
}
}
Aber warum Sie den Diskriminator machen möchten Säule? Diese Spalte ist normalerweise ein "ausgeblendetes" Implementierungsdetail, das Sie nicht anzeigen möchten. –
Die Diskriminatorspalte wurde bereits in MappedSuperClass exponiert, die ein Teil des externen Pakets ist. Ein Paket, das ich möglichst nicht modifizieren möchte. –