2017-02-10 41 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