0

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

上記のクエリは、両方のテーブルから一意の行を返します。

解決策を教えてください。

4

1 に答える 1