我有一个包含三个子表 Sub1、Sub2 和 Sub3 的 HeaderTable。Sub1 和 Sub2 需要引用 HeaderTable 中的同一行数据,而 Sub3 需要引用另一行数据。
我所做的是创建一个abstractHeader,然后由HeaderTableA 和HeaderTableB 的两个实现扩展。
HeaderTableA 有一个 Sub1 和 Sub2 的列表,而 HeaderTableB 有一个 Sub3 的列表。
HeaderTable 中的鉴别器列是 messageType,然后将其设置为 HeaderTableA 上的鉴别器值“WO”和 HeaderTableB 上的“CO”。
保留 HeaderTableB(CASCADE.ALL to Sub3) 没有问题,因为它只包含一个列表。当我尝试持久化 HeaderTableA 时出现问题,其中 sub1 列表和列表 sub2 都有数据。但是,如果只填充了 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;
}
}
请参考下图更好地描述表结构: