Under Hibernate Core 3.1 + Hibernate Annotation 3.1 beta 7
Two annotated entity with composite key: Sales(master, with FormPk) and SalesItem(detail, with FormItemPk)
Code:
@Embeddable(access = AccessType.FIELD)
public class FormPk implements Serializable {
private String formType;
private String formNo;
public FormPk() {
}
public FormPk(String formType, String formNo) {
this.formType = formType;
this.formNo = formNo;
}
public String getFormType() {
return formType;
}
public void setFormType(String formType) {
this.formType = formType;
}
public String getFormNo() {
return formNo;
}
public void setFormNo(String formNo) {
this.formNo = formNo;
}
@Override
public int hashCode() {
int typeHash = (formType != null) ? formType.hashCode() : 0;
int noHash = (formNo != null) ? formNo.hashCode() : 0;
return typeHash + noHash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (!(obj instanceof FormPk)) return false;
if (formType == null || formNo == null) return false;
FormPk pk = (FormPk)obj;
return formType.equals(pk.formType) && formNo.equals(pk.formNo);
}
}
@Entity(access = AccessType.FIELD)
@Table(name = "COPTG")
public class Sales implements Serializable {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "formType", column = @Column(name = "TG001")),
@AttributeOverride(name = "formNo", column = @Column(name = "TG002"))
})
private FormPk pk;
@OneToMany
@JoinColumns({
@JoinColumn(name = "TH001", referencedColumnName = "TG001"),
@JoinColumn(name = "TH002", referencedColumnName = "TG002")
})
private Set<SalesItem> salesItems;
public FormPk getPk() {
return pk;
}
public void setPk(FormPk pk) {
this.pk = pk;
}
public Set<SalesItem> getSalesItems() {
return salesItems;
}
}
@Embeddable(access = AccessType.FIELD)
public class FormItemPk implements Serializable {
private String formType;
private String formNo;
private String itemNo;
public FormItemPk() {
}
public FormItemPk(String formType, String formNo, String itemNo) {
this.formType = formType;
this.formNo = formNo;
this.itemNo = itemNo;
}
public String getFormType() {
return formType;
}
public void setFormType(String formType) {
this.formType = formType;
}
public String getFormNo() {
return formNo;
}
public void setFormNo(String formNo) {
this.formNo = formNo;
}
public String getItemNo() {
return itemNo;
}
public void setItemNo(String itemNo) {
this.itemNo = itemNo;
}
@Override
public int hashCode() {
int typeHash = (formType != null) ? formType.hashCode() : 0;
int noHash = (formNo != null) ? formNo.hashCode() : 0;
int itemHash = (itemNo != null) ? itemNo.hashCode() : 0;
return typeHash + noHash + itemHash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (!(obj instanceof FormItemPk)) return false;
if (formType == null || formNo == null || itemNo == null) return false;
FormItemPk pk = (FormItemPk)obj;
return formType.equals(pk.formType) && formNo.equals(pk.formNo) && itemNo.equals(pk.itemNo);
}
}
@Entity(access = AccessType.FIELD)
@Table(name = "COPTH")
public class SalesItem implements Serializable {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "formType", column = @Column(name = "TH001")),
@AttributeOverride(name = "formNo", column = @Column(name = "TH002")),
@AttributeOverride(name = "itemNo", column = @Column(name = "TH003"))
})
private FormItemPk pk;
@ManyToOne
@JoinColumns({
@JoinColumn(name="TH001", referencedColumnName="TG001", insertable = false, updatable = false),
@JoinColumn(name="TH002", referencedColumnName="TG002", insertable = false, updatable = false)
})
private Sales sales;
public FormItemPk getPk() {
return pk;
}
public void setPk(FormItemPk pk) {
this.pk = pk;
}
public Sales getSales() {
return sales;
}
}
when I navigate from SalesItem to Sales(by invoking aSalesItem.getSales()), I got exactly one result, but when I navigate from Sales to SalesItem(by invoking aSales.getSalesItems()), the result is empty why?