在使用 @JoinTable 时,我的应用程序出现了这个奇怪的问题。
我有3个实体: EntityA , EntityB 和 EntityC 。
EntityA.class
@OneToMany(fetch = FetchType.LAZY, mappedBy = "entityA")
public Set<EntityB> getEntityBSet() {
return entityBSet;
}
EntityB.class
@ManyToOne
@JoinColumn(name = "ID_ENTITY_A", nullable = false)
public EntityA getEntityA() {
return entityA;
}
@ManyToOne
@JoinTable(name = "B_AND_C",
joinColumns = { @JoinColumn(name = "ID_ENTITY_B") },
inverseJoinColumns = {@JoinColumn(name = "ID_ENTITY_C") })
public EntityC getEntityC() {
return entityC;
}
EntityC.class
@OneToMany(cascade = CascadeType.ALL, mappedBy="entityC")
public Set<EntityB> getEntityBSet() {
return entityBSet;
}
在我尝试通过entityA.getEntityBSet()访问entityB之前,一切正常。
Hibernate没有为关系 entityB.entityC 生成正确的SQL,从而创建了一个笛卡尔积:
SELECT ...
FROM ENTITY_B, B_C, ENTITY_C
WHERE B_C.ID_ENTITY_C = ENTITY_C.ID_ENTITY_C (+)
AND ENTITY_B.ID_ENTITY_A = ?
ENTITY_B和B_C之间应该有联接:
AND ENTITY_B.ID_ENTITY_B = B_C.ID_ENTITY_B
另一方面,当通过session.get()加载entityB时,生成的SQL对于该关系是正确的(entityB.entityC)。
任何帮助表示感谢。