0

好的,我们的数据库团队提出了以下结构。我无法改变它:

报告

  • 具有参考编号 (REF_NR) 作为其 PID
  • 加上一些关于报告、报告日期等的数据

财产

  • 具有参考编号 (REF_NR)建筑物编号 (BLG_NR) 作为其复合 PID。报告的 REF_NR 将与报告中所有属性的 REF_NR 匹配,这些属性由其 BLG_NR 进一步索引。
  • 加上一些关于建筑、平方英尺等的数据

施工数据

  • 具有参考编号 (REF_NR)、建筑编号 (BLG_NR)、结构类型代码 (STRCT_TYP_CD) 和材料类型代码 (MTRL_TYP_CD)
  • 具有一个值,该值通常表示给定结构类型的 %ge,即给定材料类型。例如,50% 的 ROOF 为 SLATE,50% 的 ROOF 为 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

看起来连接列属于关系中的“子”,而不是父。我在这两个地方都有。

此外,虽然它没有显示,但我遇到了另一个问题,即如果您只尝试映射复合键的一部分,hibernate 3.3.2 不喜欢它。在我真正的问题中,父项的 PK 中有第三个字段也在子项中,而我没有在连接表中映射该字段。一旦我添加它,一切都很好。

彼得

于 2011-05-19T18:47:00.083 回答