-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Lazy Initialisierung beim Entfernen eines Eintrags
PostPosted: Wed Oct 13, 2010 8:24 am 
Newbie

Joined: Tue Jun 01, 2010 10:18 am
Posts: 15
Hallo an alle!

Ich steck zur Zeit in Problemen mit JPA / Hibernate. Ich habe eine manytomany Verbindung mit einer Zwischentabelle: Person <-> Person_Project <-> Projekt.
Mapping owner ist das Projekt. Was problemlos funktioniert ist das Löschen von Projekten, nicht aber das Löschen von Personen, da es da zu Fehlern kommt.

Ich habe eine Testmethode in der folgenden Form:
Code:
@Test
public void testRemovePerson() {
   // get all persons from database
   Set<Person> persons = service.getAllPersons();
   Iterator<Person> iterator = persons.iterator();

   if (iterator.hasNext()) {
      Person person = iterator.next();
      service.removePerson(person.getId());

      // check if there are not any persons there
      persons = service.getAllPersons();
      assertEquals(persons.size(), persons.size()-1);
   }
}

Ich lasse mir alle Personen zurückgeben und sage dann, dass die Person entfernt werden soll:
Code:
service.removePerson(person.getId());

Diese ruf die Serviceimplementierung auf:
Code:
public void removePerson(int personId) {
        Person person = findPersonById(personId);
        Set<Project> projects = person.getProjects();

        // delete all entries in Project_Person for this person
        Iterator<Project> iterator = projects.iterator();
        while (iterator.hasNext()) {
            Project project = iterator.next();

            if (project.getPersons().contains(person)) {
                project.getPersons().remove(person);
                projectDao.updateProject(project);
            }
        }
        personDao.removePerson(personId);
    }

Hier kommt es dann auch zum Fehler in Zeile "Iterator<Project> iterator = projects.iterator();"
Quote:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.testdomain.projectname.domain.Person.projects, no session or session was closed


Das Problem liegt wohl weiter vorne, in dieser Zeile:
Code:
Person person = findPersonById(personId);


Der Aufruf geht zur Dao Implementierung:
Code:
public Person findPersonById(int personId) {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session sess = sessionFactory.getCurrentSession();

        Transaction tx = sess.beginTransaction();
        try {
            Person person = (Person)sess.createQuery("from Person where id = "+personId).list().get(0);
            tx.commit();
            return person;
        }
        catch (IndexOutOfBoundsException ex) {
            return null;
        }
    }

Und hier werden ja nur "reine" Personen geholt und nicht auch die dazugehörigen Projekte. So kann ich natürlich nicht über Projekte iterieren. Was kann ich tun um das zu verhindern bzw. dass die Projekte hier auch mitgeladen werden, so dass ich sie die Verknüpfungen in der Tabelle Projekt_PErson löschen kann um danach die Person zu entfernen?

Ich hoffe es hat jemand eine Idee dazu?

Danke + Gruss PHANTOMIAS

Update: Was ich nicht will, ist die Beziehung auf FetchType.EAGER umzustellen, ich will eigentlich wirklich nur dann Projekt bzw. Person laden wenn es notwendig ist.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.