Ich habe eine HeaderTable mit drei untergeordneten Tabellen Sub1, Sub2 und Sub3. Sub1 und Sub2 müssen sich auf dieselben Zeilendaten in HeaderTable beziehen, während Sub3 sich auf andere Zeilendaten beziehen muss.
Ich habe einen abstractHeader erstellt, der dann durch zwei Implementierungen von header, HeaderTableA und HeaderTableB, erweitert wird.
HeaderTableA hat eine Liste von Sub1 und Sub2, während HeaderTableB eine Liste von Sub3 hat.
Die Diskriminatorspalte in der HeaderTable ist messageType, die dann auf den Diskriminatorwert "WO" in HeaderTableA und "CO" in HeaderTableB gesetzt wird.
Es gibt kein Problem beim Persistieren von HeaderTableB(CASCADE.ALL to Sub3), weil es nur eine Liste enthält. Das Problem tritt auf, wenn ich versuche, HeaderTableA zu persistieren, wo sowohl die Liste sub1 als auch die Liste sub2 Daten enthält. Wenn jedoch nur die Liste sub1 oder die Liste sub2 gefüllt ist, lässt sie sich auch problemlos aufrechterhalten.
Der aufgetretene Fehler besteht darin, dass der Fremdschlüssel ID(headerID) nicht existiert.
Etwa so:
@Entity
@Table(name="CODE")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING, name="codeType")
@DiscriminatorValue(value="UNKNOWN")
public abstract class BusinessCode extends DateExpirableWithId<Long> {
private static final long serialVersionUID = -2766041951015641149L;
private String code;
@Column(updatable=false, insertable=false)
private String codeType;
private String language;
private String description;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getCodeType() {
return codeType;
}
public void setCodeType(String codeType) {
this.codeType = codeType;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("BusinessCode [code=");
builder.append(code);
builder.append(", codeType=");
builder.append(codeType);
builder.append(", language=");
builder.append(language);
builder.append(", description=");
builder.append(description);
builder.append("]");
return builder.toString();
}
}
@Entity
@DiscriminatorValue(value="CountryCode")
public class CountryCode extends BusinessCode {
private static final long serialVersionUID = -7207238725104662784L;
private List<SubProperty1> subProperties1;
private List<SubProperty2> subProperties2;
public List<SubProperty1> getSubProperties1() {
return subProperties1;
}
public void setSubProperties1(List<SubProperty1> subProperties1) {
this.subProperties1 = subProperties1;
}
public List<SubProperty2> getSubProperties2() {
return subProperties2;
}
public void setSubProperties2(List<SubProperty2> subProperties2) {
this.subProperties2 = subProperties2;
}
}
Eine bessere Beschreibung der Tabellenstruktur finden Sie im nachstehenden Diagramm: