JPA OneToMany eager fetch funktioniert nicht
Ich habe ein seltsames problem mit zwei Einheiten mit eins-zu-viele-Beziehung in JPA. Ich verwende Glassfish 3.1.2.2 mit EclipseLink 2.3.2. Dies ist die erste Entität:
@NamedQueries({
@NamedQuery(name="SampleQueryGroup.findAll", query="SELECT g FROM SampleQueryGroup g")
})
@Entity
public class SampleQueryGroup implements Serializable {
//Simple properties, including id (primary key)
@OneToMany(
mappedBy = "group",
fetch = FetchType.EAGER,
cascade = {CascadeType.REMOVE, CascadeType.MERGE}
)
private List<SampleQuery> sampleQueries;
//Gettes/setters, hashcode/equals
}
- Und das ist das zweite:
@Entity
public class SampleQuery implements Serializable {
//Simple properties, including id (primary key)
@ManyToOne(cascade = {CascadeType.PERSIST})
private SampleQueryGroup group;
//Gettes/setters, hashcode/equals
}
Habe ich eine zustandslose session-bean, die mit einem injizierten EntityManager
laufen SampleQueryGroup.findAll
benannte Abfrage. Ich habe auch eine CDI managed bean fordert die SSB-Methode und durchläuft die SampleQueryGroup.getSampleQueries()
für jeden SampleQueryGroup
von der Methode zurückgegeben. Ich wusste nicht, fügen Sie den code, wie es ist ziemlich einfach und irgendwie standard für alle Java-EE-Anwendung.
Das problem ist das eager fetch funktioniert nicht, und getSampleQueries()
gibt eine leere Liste zurück. Jedoch, wenn ich den fetch-Typ wieder auf FetchType.FAUL, alles funktioniert und ich bekomme die Liste korrekt gefüllt. Ich verstehe nicht, warum dies geschieht. Hat es was zu tun mit internen caching-Mechanismen?
InformationsquelleAutor Arash Shahkar | 2013-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vermutung ist, dass beim hinzufügen eines neuen SampleQuery Sie nicht hinzufügen, um das SampleQueryGroup sampleQueries, so, wenn Sie Zugriff haben, es ist nicht Ihre. Wenn es FAUL ist Sie nicht, lösen Sie es, bis Sie eingefügt haben die SampleQuery, damit es dann da ist.
Müssen Sie halten beide Seiten Ihre Beziehungen. (Sie können auch deaktivieren Sie caching, oder refesh das Objekt, aber dein code würde immer noch kaputt).
Sehen,
http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side
InformationsquelleAutor James