A类
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "A")
private Set<B> Bs = new HashSet<B>();
B类
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "INT_C", nullable = false, insertable = false, updatable = false),
@JoinColumn(name = "SBC_C", nullable = false, insertable = false, updatable = false) })
private A a;
当我执行getB()
时,我只会获得一行,而INT_C
和SBC_C
的组合则会有3行。
请告诉我这里有什么问题。
Rows in DB
SBC_C INT_C FILE_C OUTPUT_FILE_NM
--------------------------------------------
MYACCESS CR CRC DataHub_DEVC.dat
MYACCESS CR CRG DataHub_DEVG.dat
MYACCESS CR CRU DataHub_DEVU.dat
B实体ID:
@EmbeddedId
private ObFileId id;
ObFileId类:
@Embeddable
public class ObFileId implements IXDomain {
@Override
public int hashCode() {
return getICode().hashCode() + getSCode().hashCode();
}
@Override
public boolean equals(Object obj) {
return ((obj instanceof ObFileId)
&& (getICode().equals(((ObFileId) obj)
.getICode())) && (getSubscriberCode()
.equals(((ObFileId) obj).getSCode())));
}
答案 0 :(得分:0)
当您计划在Collections
中添加对象时,例如Set
,您必须覆盖equals()
和hashCode()
方法,以便系统可以比较2个实例和检测它们是否等于。在Sets
中,您不能有重复项,因此当您添加实例而Set
内的另一个实例等于该实例时,第二个实例不会被添加到{{1} }。
Set
方法的一个示例,equals()
为int
,它完全标识了实例(主键):
id
可能的@Override
public boolean equals(Object o) {
if (o instanceof B) {
B b = (B)o;
return b.id == this.id;
}
return false;
}
方法:
hashCode()
尝试更多地了解这两种方法,因为它们在java编程中非常重要,特别是对于JPA / Hibernate。
修改强>
embeddable类包含2个字段,但它不是B表的主键,因为3行对这2个字段具有完全相同的值。 3行被视为等于,在@Override
public int hashCode() {
return new Integer(id).hashCode();
}
中第一次插入后,其他2行未添加。
将构成B表主键的所有字段添加到您的可嵌入类中,并修改您的Set
和equals()
方法以包含新字段(hashCode()
字段可以是独特的遗失领域)。然后应将这些行视为不同,并将每一行添加到FILE_C
。