0

さて、私たちのDBチームは次の構造を考え出しました。私はそれを変更することはできません:

報告する

  • PIDとして参照番号(REF_NR)があります
  • さらに、レポート、レポートの日付などに関するいくつかのデータ

財産

  • 複合PIDとして参照番号(REF_NR)と建物番号(BLG_NR)があります。レポートのREF_NRは、レポートのすべてのプロパティのREF_NRと一致します。これらのプロパティは、BLG_NRによってさらにインデックスが付けられます。
  • 加えて、ビルド、平方フィートなどに関するいくつかのデータ

建設データ

  • 参照番号(REF_NR)、建物番号(BLG_NR)、構造タイプコード(STRCT_TYP_CD)、および材料タイプコード(MTRL_TYP_CD)があります
  • は、一般に、指定された材料タイプである指定された構造タイプの%geを表す値を持ちます。たとえば、ROOFの50%はSLATEであり、ROOFの50%はTILEです。

これらを結合して、レポート、関連するすべての建物、および各建物のすべての建設データを取り込むようにしていますが、JPAと休止状態の注釈にはほとんど慣れていません。

それで、これらのものを一緒に結合するための適切なクラスと注釈を決定するのを手伝ってください。または、本当に良い例への良いリンクでさえも役立つでしょう。

@Entity
@Table(name="RCT_REPORT")
public class Report implements Serializable {
    private Set<Building> buildings;
    private long referenceNumber;

    @Id
    @Column(name="REF_NR")
    public long getReferenceNumber() {
        return this.referenceNumber;
    }
    public void setReferenceNumber(long referenceNumber) {
        this.referenceNumber = referenceNumber;
    }

    @OneToMany(mappedBy="report", fetch=FetchType.EAGER)
    public Set<Building> getBuildings() {
        return this.buildings;
    }
    public void setBuildings(Set<Building> buildings) {
        this.buildings = buildings;
    }   
}

@Entity
@Table(name="RCT_BUILDING")
public class Building implements Serializable {
    private Report report;
    private Set<ConstructionData> constructionData;
    private BuildingPK id;

    @EmbeddedId
    public BuildingPK getId() {
        return this.id;
    }

    public void setId(BuildingPK id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name="REF_NR", insertable=false, updatable=false)
    public Report getReport() {
        return this.report;
    }
    public void setReport(Report report) {
        this.report = report;
    }   

    @OneToMany(mappedBy="building", fetch=FetchType.EAGER)
    @JoinColumns ({
        @JoinColumn(name="REF_NR", referencedColumnName = "REF_NR"),
        @JoinColumn(name="BLG_NR", referencedColumnName = "BLG_NR")
    })
    public Set<ConstructionData> getConstructionData() {
        return this.constructionData;
    }

    public void setConstructionData(Set<ConstructionData> constructionData) {
        this.constructionData = constructionData;
    }   
}

@Embeddable
public class BuildingPK implements Serializable {
    private long referenceNumber;
    private int buildingNumber;

    @Column(name="REF_NR")
    public long getReferenceNumber() {
        return this.referenceNumber;
    }
    public void setReferenceNumber(long referenceNumber) {
        this.referenceNumber = referenceNumber;
    }

    @Column(name="BLG_NR")
    public int getBuildingNumber() {
        return this.buildingNumber;
    }
    public void setBuildingNumber(int buildingNumber) {
        this.buildingNumber = buildingNumber;
    }

    public boolean equals(Object other) {
        ...
    }

    public int hashCode() {
        ...
    }
}

@Entity
@Table(name="CNSTRCTN_DATA")
public class ConstructionData implements Serializable {
    private ConstructionDataPK id;
    private BigDecimal value;
    private Building building;

    @EmbeddedId
    public ConstructionDataPK getId() {
        return this.id;
    }
    public void setId(ConstructionDataPK id) {
        this.id = id;
    }


    @Column(name="MTRL_SEL_VAL")
    public BigDecimal getValue() {
        return this.value;
    }
    public void setValue(BigDecimal value) {
        this.value = value;
    }


    @ManyToOne
    @JoinColumns ({
        @JoinColumn(name="REF_NR", referencedColumnName="REF_NR", insertable=false, updatable=false),
        @JoinColumn(name="BLG_NR", referencedColumnName="BLG_NR", insertable=false, updatable=false)
    })
    public Building getBuilding() {
        return this.building;
    }

    public void setBuilding(Building building) {
        this.Building = building;
    }   
}

@Embeddable
public class ConstructionDataPK implements Serializable {
    private long referenceNumber;
    private int buildingNumber;
    private String structureTypeCode;
    private String materialTypeCode;

    @Column(name="REF_NR")
    public long getReferenceNumber() {
        return this.referenceNumber;
    }
    public void setReferenceNumber(long referenceNumber) {
        this.referenceNumber = referenceNumber;
    }

    @Column(name="BLG_NR")
    public int getbuildingNumber() {
        return this.buildingNumber;
    }
    public void setbuildingNumber(int buildingNumber) {
        this.buildingNumber = buildingNumber;
    }

    @Column(name="STRCT_TYP_CD")
    public String getStructureTypeCode() {
        return this.structureTypeCode;
    }
    public void setStructureTypeCode(String structureTypeCode) {
        this.structureTypeCode = structureTypeCode;
    }

    @Column(name="MTRL_TYP_CD")
    public String getMaterialTypeCode() {
        return this.materialTypeCode;
    }
    public void setMaterialTypeCode(String materialTypeCode) {
        this.materialTypeCode = materialTypeCode;
    }

    public boolean equals(Object other) {
        ...
    }

    public int hashCode() {
        ...
    }
}

私が言ったように、私はこれにかなり慣れていません、そしてこれはすべて私には正しいように見えます、しかし私は何かが欠けていると確信しています。
ありがとう!ピーター

4

1 に答える 1

0

結合列は、親ではなく関係の「子」に属しているようです。私は両方の場所にそれらを持っていました。

また、表示されませんが、複合キーの一部のみをマップしようとすると、休止状態 3.3.2 がそれを好まないという別の問題がありました。私の実際の問題では、親の PK に 3 番目のフィールドがあり、それは子にもありましたが、結合テーブルにマップされていませんでした。追加したら、すべてがうまく結合されました。

ピーター

于 2011-05-19T18:47:00.083 に答える