vanTb と vanSiteTb の 2 つのテーブルがあります。vanTb の主キーは vId です。vanSiteTb には、2 列の複合主キーがあります。vNum と vSiteC。
vanTb には、vNum と vSiteC の 2 つの列もあります。
これら 2 つのテーブルの間には 1 対 1 の関係があります。
データベース スキーマはレガシー データベースのものであるため、変更できません。
休止状態で、2 つのエンティティ Bean を定義しました。VanTb.java および VanSiteTb.java。
VanSiteTb.java については、@Embeddable を使用して新しい Java クラスを定義しました。このクラスのオブジェクトは、@EmbeddedId を使用して VanSiteTb.java で定義されます。
ここで、これら 2 つのテーブル間に 1 対 1 の関係を定義したいと思います。
そう、
@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;
}
}
1 対 1 の関係を定義するには、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
上記のクエリは、両方のテーブルから一意の行を返します。
解決策を教えてください。