Sub1、Sub2、および Sub3 の 3 つの子テーブルを持つ HeaderTable があります。Sub1 と Sub2 は HeaderTable の同じ行データを参照する必要があり、Sub3 は別の行データを参照する必要があります。
私がしたことは、ヘッダーの2つの実装、HeaderTableAとHeaderTableBによって拡張されるabstractHeaderを作成することでした。
HeaderTableA には Sub1 と Sub2 のリストがあり、HeaderTableB には Sub3 のリストがあります。
HeaderTable の識別子列は messageType であり、HeaderTableA では識別子値 "WO" に、HeaderTableB では "CO" に設定されます。
HeaderTableB(CASCADE.ALL to Sub3) にはリストが 1 つしか含まれていないため、永続化しても問題はありません。この問題は、sub1 のリストと sub2 のリストの両方にデータがある HeaderTableA を永続化しようとすると発生します。ただし、sub1 のリストまたは sub2 のリストのみが入力されている場合は、問題なく持続します。
発生したエラーは、外部キー ID (headerID) が存在しないことを主張しています。
このようなもの:
@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;
}
}
テーブル構造のより良い説明については、以下の図を参照してください。