3

我有一个包含三个子表 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;
    }
}

请参考下图更好地描述表结构: 在此处输入图像描述

4

1 回答 1

2

我认为这听起来更像是 InheritanceType.JOINED。JOINED 策略不需要鉴别器。

BusinessCode.java(假设你的超类有 ID 列等)

@Entity
@Table(name="CODE")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class BusinessCode extends DateExpirableWithId<Long> {

    private static final long serialVersionUID = -2766041951015641149L;

    @Column(nullable = false)
    private String code;

    @Column(nullable = false)
    private String language;

    @Column(nullable = false)
    private String description;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    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;
    }
}

国家代码.java

@Entity
@Table(name="COUNTRY_CODE")
@Inheritance(strategy = InheritanceType.JOINED)
public class CountryCode extends BusinessCode {
  @Column
  private String countryName;

  public String getCountryName() { return countryName; }
  public String setCountryName(String value) { countryName = value; }
}

部门代码.java

@Entity
@Table(name="DEPARTMENT_CODE")
@Inheritance(strategy = InheritanceType.JOINED)
public class DepartmentCode extends BusinessCode {
  @Column
  private String departmentName;

  public String getDepartmentName() { return departmentName; }
  public String setDepartmentName(String value) { departmentName= value; }
}

您的表结构将如下所示:

BUSINESS_CODE
  ID(PK)
  CODE,
  LANGUAGE,
  DESCRIPTION

COUNTRY_CODE
  ID(FK), 
  COUNTRYNAME

DEPARTMENT_CODE
  ID(FK)
  DEPARTMENTNAME

数据看起来像这样:

BUSINESS_CODE
1, "AU","EN","australia country code in english"
2, "AU","FR","australia country code in french"
3, "FIN","EN","finance department code"

COUNTRY_CODE
1, "Australia"
2, "Australie"

DEPARTMENT_CODE
3, "Bean Counters"
于 2012-08-22T03:46:24.347 回答