Hallo an alle!
Ich erhalte folgende Meldung beim Laufen meines Tests:
Aber nun mal zur Erklärung: Ich habe hier eine n:m Relation und zwischen Group und User.
Mit Hibernate habe ich das so notiert um eine bidirektionale manytomany Verbindung zu erreichen:
Das Problem kann gelöst werden in dem ich den FetchType auf EAGER setze (manytomany ist ja standardmässig LAZY). Aber das will ich nicht, da ich im Frontend (Flex) eine Art Rekursion erhalte. Also ich bekomme wenn ich alle Gruppen lese, dann natürlich auch gleich alle User mit. Und die User kriegen wieder alle Gruppe, die wieder alle User, ... Ich setze also recht viele SQL-Abfragen ab und das hier ist nur ein Ausschnitt meiner Datenbank-Struktur. Im Prinzip habe ich alles EAGER gemacht um im Frontend das zu umgehen, dass ich da Libs wie Gilead einbinden muss, welche damit dann "umgehen" können, da BlazeDS als Adapter das von Hause aus nicht kann.
Also beginne ich zur Zeit das ohne EAGER allein mal auf Java-Seite zu regeln.
Was ich habe und wo der Fehler genau geworfen wird, folgt nun:
Hier habe ich die Testklasse, deren Methode aufgerufen wird:
Bei updateUser(user) geht es in die Service-Implementierung, bei der dann in der Zeiel des Iterators dann der Fehler "auftritt".
Wie kann ich das nun lösen ohne die Relation auf EAGER setzen zu müssen?
Ich nutze neben Hibernate noch Spring 3.0.3., muss aber gestehen, dass ich noch Anfänger bin.
Um Hilfe wäre ich dankbar, andernfalls habe ich nämlich auf der Zielgeraden meiner Abschlussarbeit ein Problem
Gruss PHANTOMIAS
Ich erhalte folgende Meldung beim Laufen meines Tests:
Dies scheint ein häufiges Problem zu sein, leider konnte ich bisher keine Lösung für mich finden.org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mydomain.myproject.data.domain.User.groups, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
at com.mydomain.myproject.data.services.PersonServiceImpl.updatePerson(UserServiceImpl.java:45)
at com.mydomain.testing.UserTest.testUpdateUser(UserTest.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Aber nun mal zur Erklärung: Ich habe hier eine n:m Relation und zwischen Group und User.
Mit Hibernate habe ich das so notiert um eine bidirektionale manytomany Verbindung zu erreichen:
Java:
User.java
@ManyToMany(mappedBy="users")
private List<Group> groups;
Java:
Group.java
@ManyToMany
@JoinTable(name = "Group_User",
joinColumns = {@JoinColumn(name="group_id", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}
)
private List<User> users;
Das Problem kann gelöst werden in dem ich den FetchType auf EAGER setze (manytomany ist ja standardmässig LAZY). Aber das will ich nicht, da ich im Frontend (Flex) eine Art Rekursion erhalte. Also ich bekomme wenn ich alle Gruppen lese, dann natürlich auch gleich alle User mit. Und die User kriegen wieder alle Gruppe, die wieder alle User, ... Ich setze also recht viele SQL-Abfragen ab und das hier ist nur ein Ausschnitt meiner Datenbank-Struktur. Im Prinzip habe ich alles EAGER gemacht um im Frontend das zu umgehen, dass ich da Libs wie Gilead einbinden muss, welche damit dann "umgehen" können, da BlazeDS als Adapter das von Hause aus nicht kann.
Also beginne ich zur Zeit das ohne EAGER allein mal auf Java-Seite zu regeln.
Was ich habe und wo der Fehler genau geworfen wird, folgt nun:
Hier habe ich die Testklasse, deren Methode aufgerufen wird:
Code:
UserTest.java
@Test
public void testUpdateUser() {
List<User> users = service.getAllUsers();
User user = users.get(0);
// change & save user
user.setEmail("updateMail@test.com");
// HERE IS THE ERROR TRACE
service.updateUser(user);
// ...
}
Java:
UserServiceImpl.java
public void updateUser(User u) {
List<Group> groups = u.getGroups();
// THIS LINE ERROR TRACE
Iterator<Group> iterator = groups.iterator();
while (iterator.hasNext()) {
Group group = iterator.next();
// ...
}
// ...
}
Ich nutze neben Hibernate noch Spring 3.0.3., muss aber gestehen, dass ich noch Anfänger bin.
Um Hilfe wäre ich dankbar, andernfalls habe ich nämlich auf der Zielgeraden meiner Abschlussarbeit ein Problem
Gruss PHANTOMIAS