3

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

テーブル構造のより良い説明については、以下の図を参照してください。 ここに画像の説明を入力

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

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

DepartmentCode.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 に答える