2017-05-25 11 views
2

MyテーブルVENDORBRANCHには複合キーがあります。@Id注釈を使用し、@IdClassを使用して定義した「vendorCode」と「vendorBranchCode」です。フィールド "vendorCode"は、VENDORCRTERMSクラスの外部キーとして参照されます。私はpostgresql dbを使用しています。 は今サービスimplimentationの私のSQLクエリは次のようになりますが、私は、クエリで複合キーを含める:複合キー結合列

Query<?> query = session.createQuery("from VENDORBRANCH where vendorCode = ?"); 
     query.setParameter(0, mf01_vendorCode); 

私は冬眠するのは非常に新しいですので、選択クエリのためのいくつかのオプションを試してみましたが、私は」このようにするのが正しいかどうかわからない。では、複合キーに使用する最適なselectステートメントは何でしょうか?

VENDORBRANCHクラス:

import java.io.Serializable; 
import java.util.Date;  
import javax.persistence.Embeddable; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.IdClass; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import com.parkson.poMain.backend.data.VENDORBRANCH.VBpk; 

@SuppressWarnings("serial") 
@Entity 
@IdClass(VBpk.class) 
public class VENDORBRANCH implements Serializable { 

    @Id 
    private String vendorCode; 

    @Id 
    private String vendorBranchCode; 

    //getters and setters 

    // inner class defined for primary key(composite keys) 
    public static class VBpk implements Serializable { 
     protected String vendorCode; 
     protected String vendorBranchCode; 

     public String getvendorCode() { 
      return vendorCode; 
     } 

     public void vendorCode(String vendorCode) { 
      this.vendorCode = vendorCode; 
     } 

     public String vendorBranchCode() { 
      return vendorBranchCode; 
     } 

     public void vendorBranchCode(String vendorBranchCode) { 
      this.vendorBranchCode = vendorBranchCode; 
     } 

     public VBpk(){} 

     public VBpk(String vendorCode,String vendorBranchCode){ 
       this.vendorCode = vendorCode; 
       this.vendorBranchCode = vendorBranchCode; 
      } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((vendorBranchCode == null) ? 0 : vendorBranchCode.hashCode()); 
      result = prime * result + ((vendorCode == null) ? 0 : vendorCode.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      VBpk other = (VBpk) obj; 
      if (vendorBranchCode == null) { 
       if (other.vendorBranchCode != null) 
        return false; 
      } else if (!vendorBranchCode.equals(other.vendorBranchCode)) 
       return false; 
      if (vendorCode == null) { 
       if (other.vendorCode != null) 
        return false; 
      } else if (!vendorCode.equals(other.vendorCode)) 
       return false; 
      return true; 
     }  
    } 
} 

私の他のクラス:VENDORCRTERMS

import java.io.Serializable; 
import java.util.Date;  
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 

@SuppressWarnings("serial") 
@Entity 
public class VENDORCRTERMS implements Serializable { 

    @Id 
    private String vcrId ; 

    //This is the foreign key referenced from **VENDORBRANCH class** 
@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="vendorcode", nullable = false), 
    @JoinColumn(name="vendorBranchCode", nullable = false)}) 
    private VENDORBRANCH vendorbranch_vendorcode = new VENDORBRANCH();  

    // foreign key referenced from a different class 
    @ManyToOne 
    @JoinColumn(name= "creditterms_credittermscode" , nullable = false) 
    private CREDITTERMS creditterms_credittermscode = new CREDITTERMS(); 

    //getters and setters 

} 
+0

したがって、VENDORBRANCHには2つのPK列があり、1つの「JoinColumn」...を定義すると、何が分かりにくいですか? –

答えて

3

VENDORBRANCHは複合プライマリキーを定義していますが、VENDORCRTERMSには参照用に@JoinColumnのみを使用しています。

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="vendorCode", referencedColumnName="vendorCode"), 
    @JoinColumn(name="vendorBranchCode", referencedColumnName="vendorBranchCode") 
}) 
private VENDORBRANCH vendorbranch_vendorcode 
0

理由は、彼が2つの@id sがVENDORBRANCHであることが認められているためVENDORCRTERMSクラスが混乱しています。私にはあなたのための解決策があります。 vendorCodevendorBranchCodeを​​とし、1つの主キーのみを保持するとどうなりますか?

@Id 
private String vendorCode; 

これはあなたの要求を満たすものだと思います。