【问题标题】:How to do one-one mapping between 2 tables having composite key in hibernate?如何在休眠中具有复合键的2个表之间进行一对一映射?
【发布时间】:2017-06-28 21:42:41
【问题描述】:

我有 2 个表 vanTb 和 vanSiteTb。 vanTb 的主键是 vId。 vanSiteTb 具有 2 列的复合主键,即。 vNum 和 vSiteC。

vanTb 也有 2 列 vNum 和 vSiteC。

这两个表之间存在一对一的关系。

数据库架构来自旧数据库,因此无法更改。

在休眠中,我定义了 2 个实体 bean,即。 VanTb.java 和 VanSiteTb.java。

对于 VanSiteTb.java,我使用 @Embeddable 定义了一个新的 java 类。此类的对象在 VanSiteTb.java 中使用 @EmbeddedId 定义。

现在,我想在这两个表之间定义一对一的关系。

所以,

    @Entity
    @Table(name = "<name>", schema = "<name>")
    public class vanTb implements Serializable{

    @Id
    @Column(name="vId", insertable = false, updatable = false)
    private int vId;



    @Column(name="vNum", insertable = false, updatable = false)
    private String vNum;

    @Column(name="vSiteC", insertable = false, updatable = false)
    private String vSiteC;

    @OneToOne
    @JoinColumn(???)
    private vanSiteTb v;

    }

@Embeddable
public class PmKey implements Serializable {

    @Column(name = "vNum", insertable = false, updatable = false)
    private String vNum;

    @Column(name = "vSiteC", insertable = false, updatable = false)
    private String vsiteC;

    ....
    getter and setter for both properties.
...

}

@Entity
@Table(name = ".vSiteTb", schema="")
public class vSiteTb implements Serializable {

    @EmbeddedId
    private PmKey pmKey;

    @Column(name = "vNum", insertable = false, updatable = false)
    private String vNum;

    @Column(name = "vSiteC", insertable = false, updatable = false)
    private String vSiteC;

    public PmKey getPmKey() {
        return pmKey ;
    }

    public void setPmKey (PmKey pmKey ) {
        this.pmKey = pmKey ;
    }

    public String getVNum() {
        return vNum;
    }

    public void setVNum(String vNum) {
        this.vNum = vNum;
    }

    public String getVSiteC() {
        return vSiteC;
    }

    public void setVSiteC(String vSiteC) {
        this.vSiteC = vSiteC;
    }

}

现在要定义一对一的关系,我必须在 JPA 中写 @OneToOne,但是对于 @JoinColumn 应该写什么,我已经提到了???。

要从两个表中识别唯一条目,我们应该让两个表的 vNum 和 vSite 相互匹配。

select * from vanTb v, vSiteTb site where 
v.vNum = site.vNum and v.SiteC = site.SiteC
and v.vId = 1234

上述查询将从两个表中返回一个唯一的行。

请告诉我解决方案。

【问题讨论】:

    标签: hibernate jpa sybase one-to-one joincolumn


    【解决方案1】:

    要指定vanTb 内的@OneToOne 连接列到vanSiteTb,它是:

    @JoinColumns({
      @JoinColumn(name = "vNum", referencedColumnName = "vNum"),
      @JoinColumn(name = "vSiteC", referencedColumnName = "vSiteC")
    })
    

    如果您在vanSiteTb 中有一个vanTab 的主键vId 的列,您可以将其逆映射回vanTab,如下所示:

    @JoinColumn(name = "vId", referencedColumnName = "vId")
    

    请记住,name 代表您要添加连接列注释的实体的当前表中的列名,referencedColumnName 代表关联实体表中的列名。

    【讨论】:

    • 我还需要在 vanSiteTb 中写 @OneToOne 吗?如果是,那我也要在 vanSiteTb 实体 bean 中定义一个属性 vanTb 对吧?
    • 不需要在vanSiteTb中放置@OneToOne,除非需要通过对象图遍历回vanTb
    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多