我有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
上述查询将从两个表中返回一个唯一的行。
请让我知道解决方案。
我还需要在vanSiteTb中写@OneToOne吗?如果是,那么我也要在vanSiteTb实体bean中定义一个属性vanTb,对吧? – azaveri7
除非需要通过对象图回溯到'vanTb',否则不需要在'vanSiteTb'内放置'@ OneToOne'。 – Naros