【问题标题】:composite key join columns复合键连接列
【发布时间】:2017-10-25 23:58:25
【问题描述】:

我的表 VENDORBRANCH 有复合键:“vendorCode”和“vendorBranchCode”,我使用@Id 注释和@IdClass 定义了它们。字段“vendorCode”在 VENDORCTERMS 类中被引用为外键。我正在使用 postgresql 数据库。 现在我在服务实现中的 sql 查询看起来像这样,但我想在查询中包含复合键:

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

我对休眠非常陌生,因此尝试了一些选择查询的选项,但我不确定这样做是否正确。那么,对于复合键使用的最佳选择语句是什么?

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;
        }       
    }
}

我的其他班级:VENDORCTERMS

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

}

【问题讨论】:

  • 所以 VENDORBRANCH 有 2 个 PK 列,而您定义了 1 个 JoinColumn ... 那么有什么难理解的呢?

标签: java hibernate jpa orm hibernate-mapping


【解决方案1】:

VENDORBRANCH 已定义复合主键,但在 VENDORCRTERMS 中,您仅在 @JoinColumn 上使用作为参考。在您的情况下,映射应该是这样的:

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

【讨论】:

    【解决方案2】:

    原因是:VENDORCRTERMS类被混淆了,因为他观察到VENDORBRANCH中有两个@id。我有一个解决方案给你。如果您将vendorCodevendorBranchCode 设为unique key 并只保留一个主键会怎样。

    @Id
    private String vendorCode;
    

    我认为这将满足您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-18
      • 2015-04-22
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      相关资源
      最近更新 更多