JPA-Vererbung mit SINGLE_TABLE - Diskriminator-Wert nicht mit dem übereinstimmt, Klasse
Ich habe ein seltsames Verhalten mit einem JPA-Klassen-Hierarchie mit einer einzigen Tabelle.
Im Grunde habe ich zwei Entitäten EntityMapA und EntityMapB die beiden verlängern EntityMap. Die Diskriminator-Wert ist 'ENTITY_TYPE', und es ist Ein für EntityMapA und B für EntityMapB.
Irgendwie bekomme ich Objekte vom Typ EntityMapA wo der Diskriminator den Wert 'B'!
Ich bin mit Hibernate 3.3 als JPA-provider.
Hier ist der code:
@Entity
@Table(name="ENTITY_MAP")
@DiscriminatorColumn(name = "ENTITY_TYPE")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class EntityMap implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Long entityMapId;
//This is a ID of another entity we map to. It is a different entity type depending on
//The subclass. For EntityMapA it would map to EntityA and for EntityMapB it would map
//to EntityB
private Long entityId;
private String discriminator;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ENTITY_MAP_ID", unique = true, nullable = false)
public Long getEntityMapId() {
return entityMapId;
}
public void setEntityMapId(Long EntityMapId) {
this.entityMapId = entityMapId;
}
@Column(name="ENTITY_TYPE",insertable=false,updatable=false)
public String getDiscriminator() {
return discriminator;
}
public void setDiscriminator(String discriminator) {
this.discriminator = discriminator;
}
@Column(name="ENTITY_ID",insertable=false,updatable=false)
public Long getEntityId() {
return entityId;
}
public void setEntityId(Long entityId) {
this.entityId = entityId;
}
//there are other common fields in here which are left out
}
@Entity
@DiscriminatorValue("A")
public class EntityMapA extends EntityMap {
/**
*
*/
private static final long serialVersionUID = -8709307036005000705L;
private EntityA entityA;
public static final String DISCRIMINATOR = "A";
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ENTITY_ID", nullable = false)
@NotNull
public EntityA getEntityA() {
return entityA;
}
public void setEntityA(EntityA entityA) {
this.entityA = entityA;
}
}
@Entity
@DiscriminatorValue("B")
public class EntityMapB extends EntityMap {
/**
*
*/
private static final long serialVersionUID = -8709307036005000705L;
public static final String DISCRIMINATOR = "B";
private EntityB entityB;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ENTITY_ID", nullable = false)
@NotNull
public EntityB getEntityB() {
return entityB;
}
public void setEntityB(EntityB entityB) {
this.entityB = entityB;
}
}
Und dann endlich habe ich eine Zuordnung in EntityA:
@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY, mappedBy = "entityA")
public List<EntityMapA> getEntityMaps() {
return entityMaps;
}
public void setEntityMaps(List<EntityMapA> entityMaps) {
this.entityMaps = entityMaps;
}
Nun habe ich ein ENTITY_MAP Zeile mit ENTITY_TYPE = "B" und ENTITY_ID = "12345"
Es gibt sowohl eine EntityA mit der id "12345" und ein EntityB mit der ID "12345".
Wenn ich jetzt laden EntityA mit der id "12345" ist, hat einen Eintrag in der getEntityMaps() vom Typ EntityMapA aber die Diskriminator-Wert auf, dass EntityMapA ist 'B'.
Was läuft hier falsch? Warum ist eine Zeile mit dem Diskriminator 'B' zugeordnet EntityMapA Entität?
Ist es, weil ich anzeigen die EntityId zweimal (einmal mit @Column(name="ENTITY_TYPE",einsetzbaren=false,updatable=false) auf der übergeordneten Klasse und dann wieder pro JoinColumn, um die wirkliche Einheit?
UPDATE
Btw, die EntityMapA aufgelistet in der Auflistung auf EntityA ist nie wirklich geschaffen. Wenn Sie versuchen, laden Sie die Person, für die Sie eine Ausnahme und sagt Ihnen, dass diese Entität nicht existiert. Also sieht aus wie ein bug in Hibernate zu mir.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie die gleiche Spalte zum anzeigen von zwei verschiedenen Verbänden. AFAIK, dies wird nicht unterstützt.
Und es ist eigentlich eine gute Sache, denn es ist viel sauberer ist die Verwendung von zwei separaten Spalten beziehen sich auf verschiedene Dinge. Es erlaubt die Definition von einen FK-constraint auf die Spalten, zum Beispiel, das ist nicht möglich, mit Ihrer aktuellen Lösung, da die Spalte enthält die IDs der EntityA oder EntityB je nach Zeile.