如何在休眠中的两个具有复合键的表之间进行一对一映射?
How to do one-one mapping between 2 tables having composite key in hibernate?
我有 2 个表 vanTb 和 vanSiteTb。 vanTb 的主键是 vId。 vanSiteTb 有一个 2 列的复合主键,即。 vNum 和 vSiteC.
vanTb 也有 2 列 vNum 和 vSiteC。
这两个表之间存在一对一的关系。
数据库架构来自遗留数据库,因此无法更改。
在休眠中,我定义了 2 个实体 bean,即。 VanTb.java 和 VanSiteTb.java.
对于VanSiteTb.java,我使用@Embeddable 定义了一个新的java class。此 class 的对象是在 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
以上查询将 return 来自两个表的唯一行。
请告诉我解决方法。
要指定 vanTb
到 vanSiteTb
内的 @OneToOne
连接列,它将是:
@JoinColumns({
@JoinColumn(name = "vNum", referencedColumnName = "vNum"),
@JoinColumn(name = "vSiteC", referencedColumnName = "vSiteC")
})
如果您在 vanSiteTb
中有 vanTab
的主键 vId
的列,您可以像这样将其倒数映射回 vanTab
:
@JoinColumn(name = "vId", referencedColumnName = "vId")
请记住,name
代表您要添加连接列注释的实体的当前 table 中的列名,referencedColumnName
代表列名在关联实体的 table.
我有 2 个表 vanTb 和 vanSiteTb。 vanTb 的主键是 vId。 vanSiteTb 有一个 2 列的复合主键,即。 vNum 和 vSiteC.
vanTb 也有 2 列 vNum 和 vSiteC。
这两个表之间存在一对一的关系。
数据库架构来自遗留数据库,因此无法更改。
在休眠中,我定义了 2 个实体 bean,即。 VanTb.java 和 VanSiteTb.java.
对于VanSiteTb.java,我使用@Embeddable 定义了一个新的java class。此 class 的对象是在 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
以上查询将 return 来自两个表的唯一行。
请告诉我解决方法。
要指定 vanTb
到 vanSiteTb
内的 @OneToOne
连接列,它将是:
@JoinColumns({
@JoinColumn(name = "vNum", referencedColumnName = "vNum"),
@JoinColumn(name = "vSiteC", referencedColumnName = "vSiteC")
})
如果您在 vanSiteTb
中有 vanTab
的主键 vId
的列,您可以像这样将其倒数映射回 vanTab
:
@JoinColumn(name = "vId", referencedColumnName = "vId")
请记住,name
代表您要添加连接列注释的实体的当前 table 中的列名,referencedColumnName
代表列名在关联实体的 table.