2017-02-10 42 views
0

我有2個表vanTb和vanSiteTb。 vanTb的主鍵是vId。 vanSiteTb具有2列的複合主鍵,即, vNum和vSiteC。如何在休眠狀態下的複合鍵2個表之間進行一對一映射?

vanTb也有2列vNum和vSiteC。

這兩張表之間有一對一的關係。

數據庫模式來自遺留數據庫,因此無法更改。

在hibernate中,我定義了2個實體bean, VanTb.java和VanSiteTb.java。

對於VanSiteTb.java,我使用@Embeddable定義了一個新的java類。這個類的對象在使用@EmbeddedId的VanSiteTb.java中定義。

現在,我想定義這兩個表之間的一對一關係。

所以,

@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 

上述查詢將從兩個表中返回一個唯一的行。

請讓我知道解決方案。

回答

1

要指定@OneToOne加入內vanTbvanSiteTb列,這將是:

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

如果你曾經爲vanTab的主鍵vIdvanSiteTb,你將其映射回逆列到vanTab這樣的:

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

只要記住name在c代表列名要添加連接列註釋的實體的urrent表,並且referencedColumnName表示關聯實體的表中列的名稱。

+0

我還需要在vanSiteTb中寫@OneToOne嗎?如果是,那麼我也要在vanSiteTb實體bean中定義一個屬性vanTb,對吧? – azaveri7

+0

除非需要通過對象圖回溯到'vanTb',否則不需要在'vanSiteTb'內放置'@ OneToOne'。 – Naros