复合键连接列
composite key join columns
我的 table VENDORBRANCH 有 复合键 :"vendorCode" 和 "vendorBranchCode" 我使用 @Id 注释和使用 @IdClass 定义了它们.字段 "vendorCode" 在 VENDORCRTERMS class 中被引用为外键。我正在使用 postgresql 数据库。
现在我在服务实现中的 sql 查询看起来像这样,但我想在查询中包含复合键:
Query<?> query = session.createQuery("from VENDORBRANCH where vendorCode = ?");
query.setParameter(0, mf01_vendorCode);
我对休眠还很陌生,所以尝试了一些 select 查询选项,但我不确定这样做是否正确。那么,什么是用于复合键的最佳 select 语句??
VENDORBRANCH class:
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;
}
}
}
我的其他 class: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
}
原因是:VENDORCRTERMS
class迷糊了,因为他观察到VENDORBRANCH
里面有两个@id
。我有一个解决方案给你。如果您将 vendorCode
和 vendorBranchCode
设为 unique key
并且只保留一个主键会怎样?
@Id
private String vendorCode;
我想这可以满足您的需求。
VENDORBRANCH
定义了复合主键,但在VENDORCRTERMS
中你只用在@JoinColumn
上作为参考。在您的情况下,映射应该是这样的:
@ManyToOne
@JoinColumns( {
@JoinColumn(name="vendorCode", referencedColumnName="vendorCode"),
@JoinColumn(name="vendorBranchCode", referencedColumnName="vendorBranchCode")
} )
private VENDORBRANCH vendorbranch_vendorcode
我的 table VENDORBRANCH 有 复合键 :"vendorCode" 和 "vendorBranchCode" 我使用 @Id 注释和使用 @IdClass 定义了它们.字段 "vendorCode" 在 VENDORCRTERMS class 中被引用为外键。我正在使用 postgresql 数据库。 现在我在服务实现中的 sql 查询看起来像这样,但我想在查询中包含复合键:
Query<?> query = session.createQuery("from VENDORBRANCH where vendorCode = ?");
query.setParameter(0, mf01_vendorCode);
我对休眠还很陌生,所以尝试了一些 select 查询选项,但我不确定这样做是否正确。那么,什么是用于复合键的最佳 select 语句??
VENDORBRANCH class:
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;
}
}
}
我的其他 class: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
}
原因是:VENDORCRTERMS
class迷糊了,因为他观察到VENDORBRANCH
里面有两个@id
。我有一个解决方案给你。如果您将 vendorCode
和 vendorBranchCode
设为 unique key
并且只保留一个主键会怎样?
@Id
private String vendorCode;
我想这可以满足您的需求。
VENDORBRANCH
定义了复合主键,但在VENDORCRTERMS
中你只用在@JoinColumn
上作为参考。在您的情况下,映射应该是这样的:
@ManyToOne
@JoinColumns( {
@JoinColumn(name="vendorCode", referencedColumnName="vendorCode"),
@JoinColumn(name="vendorBranchCode", referencedColumnName="vendorBranchCode")
} )
private VENDORBRANCH vendorbranch_vendorcode