Hello,
I have the following example - classes A, B with a 1:n relationship.
Code:
@Entity @Table(name = "A")
@SequenceGenerator(name = "keyid_generator", sequenceName = "A_sequence")
public class A extends AbstractIntKeyIntOptimisticLockingDto {
private String name;
private Set<B> bs;
@OneToMany(mappedBy = "a", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
public Set<B> getBs() {
return bs;
}
public void setBs(Set<B> bs) {
this.bs = bs;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity @Table(name = "B")
@SequenceGenerator(name = "keyid_generator", sequenceName = "B_sequence")
public class B extends AbstractIntKeyIntOptimisticLockingDto {
private String name;
private A a;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "a", nullable = false,
unique = false, updatable = false)
@Fetch(FetchMode.JOIN)
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
If I try and select all Bs (getAll() on the DAO), Hibernate issues a select for each A (N+1 SELECT problem) despite my request for JOIN everywhere.
I know how to solve this with HQL, and I can do this which works correctly
Code:
findByCriteria(DetachedCriteria.forClass(B.class)
.setFetchMode("a", FetchMode.JOIN)
.setFetchMode("a.bs", FetchMode.JOIN)
);
but can I get it to work directly? Why do I need to explicitly mark "a.bs" as JOINed again?
I'm using hibernate core 3.3.2.GA.