2017-08-21 4 views
0

Ich habe diese Frage oft gestellt und ich weiß, warum es passiert, ich habe nur Probleme, die versuchen, es in meinem speziellen Fall zu lösen."konnte eine Sammlung von Rollen nicht träge initialisieren" in Hibernate

Ich konvertiere das Projekt, an dem ich arbeite, mithilfe von XML-Dateien, um Klassen für Hibernate-Datenbanktabellen zuzuordnen und Hibernate-Annotationen zu verwenden. Alles läuft gut, solange ich grundlegende Java-Typen (Primitive oder Klassenversionen von Primitiven, zum Beispiel int oder Integer) verwende. Aber wenn es darum geht, dass meine Klasse ein Mitglied hat, das eine andere Klasse von mir ist, gehen die Dinge nach Süden.

Eine Art von Problem ist, wenn ich OnetoMany Beziehung habe.

In der XML-Datei für foo sagt es so:

<set inverse="true" name="barList"> 
    <key> 
     <column name="foo_id"/> 
    </key> 
    <one-to-many class="com.me.model.dao.Bar" /> 
</set> 

In dieser zu einer Anmerkung Umwandlung, habe ich am Ende mit auf den Punkt:

@OneToMany 
@JoinTable(name = "bar", inverseJoinColumns = @JoinColumn(name = "foo_id")) 
public Set<Bar> getBarList() { 
    return barList; 
} 

ich andere Variationen dieser versucht haben (einschließlich habe eine JoinColumn), und ich weiß, wie es steht, kann es unvollständig sein, aber wie ich schon sagte, habe ich Probleme, eine richtige Lösung zu finden, um die faule ursprüngliche Ausnahme loszuwerden, wenn ich mit den Objekten in der Ansicht arbeite von meinem MVC. FetchType.EAGER soll ein Workaround und keine Lösung sein, aber kurioserweise werden keine Lösungen angeboten. Vielleicht werden mehr Informationen benötigt.

  • Mein MVC ist Wicket 1.4.17.
  • Meine App-Server ist Widlfly (dh keine web.xml)
  • Java-Version ist 8.
  • Hibernate, durch Maven POM
    • Artefakt:
    • Version Hibernate: 3.5.0.ga
    • Artefakt:
    • ejb3-Persistenz
    • Version: 1.0.1.GA

Edit: Es kann hilfreich sein hinzuzufügen, dass, während barList in der foo-Klasse erscheint, es keine Referenz irgendeiner Art auf bar in foo in der Datenbank gibt. Die foo-Tabelle hat eine bar_id.

+0

Angenommen, Sie möchten Bidirektional eins zu viele und viele zu eins tun ?! Können wir nur Annotationen nur dafür verwenden ?! –

+0

Sie sind bereits in der XML-Datei bidirektional zugeordnet, aber ich versuche, eine Klasse nach der anderen in Anmerkungen umzuwandeln. Viele dieser Klassen sind sehr kompliziert in Bezug auf ihre Beziehungen zwischen komplexen Objekten. Daher versuche ich Schritt für Schritt, Fehler leichter zu verfolgen und zu beheben. Temporäre gemischte XML/Annotationen scheinen im Moment für einfachere Beziehungen in Ordnung zu sein - wird es für bidirektionales Mapping in Ordnung sein, bis ich die eine Klasse funktioniere und mit der Konvertierung der anderen beginnen kann? – sorinev

+0

Sie müssen etwas über Ihre Session/Transaktionsverarbeitung posten. Vielleicht ist das Problem, dass die Sitzung, die das Lazy Loading durchführt, verschwunden ist, sobald Sie die Entity aus Ihrem Repository erhalten. (Hatte dieses Problem mit spring-webflow, vergessen Sie den -Tag) – Turo

Antwort

0

Tatsächlich helfen Anmerkungen, um das Mapping einfacher und einfacher zu machen. Sowohl XML als auch Annotation sind die gleichen Ideen (damit Hibernate die Beziehung unserer Objekte verstehen kann). In diesem Fall wird die Abbildung nur einfach wie:

@OneToMany(mappedBy="foo") 
    private Set<Bar> barList; 

Für das gesamte Detail sieht diese Probe wie die gleich Sie: https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/

Hope this Hilfe.

+0

Ich denke, ich sollte erwähnen, dass, während die Bar-Klasse einen Satz Foos hat, die Foo-Klasse einen einzigen Balken hat und in der Datenbank die Tabelle Foo überhaupt nicht erwähnt wird, aber Foo hat eine Fremdschlüssel-ID zu Bar . Ich denke, diese Eigenart ist Teil von dem, was mich vermasselt. – sorinev

+0

Ich bin mir nicht sicher, ob ich richtig lese. Aber in dem Code, den ich in der Frage gesehen ist die Foo hat ein Set @OneToMany @JoinTable (name = "bar", inverseJoinColumns = @JoinColumn (name = "foo_id")) public Set getBarList() {return BarListe; }. –

0

Ich denke, es hängt von Ihrer Konfiguration der Transaktionsverwaltung ab, denn wenn Sie FetchType.LAZY verwenden, wird Ihre faule Liste nicht geladen, bis Sie sie mit ihrer Getter-Methode aufrufen. Wenn Sie die Getter-Methode nach der Commit-Transaktion aufrufen, wird diese Ausnahme ausgelöst. Bitte überprüfen Sie Ihre Transaktionskonfiguration oder senden Sie diesen Teil des Codes hier.

Verwandte Themen