-->
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: OneToMany relation exception:failed to lazily initialization
PostPosted: Mon Mar 05, 2007 8:10 am 
Beginner
Beginner

Joined: Thu Feb 22, 2007 6:08 am
Posts: 35
Hibernate version:
Hibernate Core 3.2.2 GA
Hibernate EntityManager 3.2.1 GA

Mapping documents:
This class (Pais.java) represents a Country that have an id, a name and a List of Districts (The way that Portugal is divided). It has it setters and getters too

Code:
package immo.persistence ;

import java.util.List;
import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.OneToMany;

@Entity
@Table(name="PAISES")

/**
*This class represents a country
*
**/
public class Pais implements java.io.Serializable {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_pais")
    private Long id;
   
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
   
    @Column(name="nome_pais", nullable=false)
    private String nome;
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
   
    @OneToMany
    @JoinColumn(name="PAIS_FK")
    private List<Distrito> distritos;
   
    public List<Distrito> getDistritos() {
        return this.distritos;
    }
   
    public void setDistritos(List<Distrito> distritos) {
        this.distritos = distritos;
    }
}


The Distrito.java representa a district. It has an id, a name and a reference to a Country.

Code:

@Entity
@Table(name="DISTRITOS")
public class Distrito implements java.io.Serializable {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_pais", nullable=false)
    private Long id;
   
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    @Column(name="nome_distrito",nullable=false)
    private String nome;
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
    @JoinColumn(name="PAIS_FK", insertable=false, updatable=false)
    private immo.persistence.Pais pais;
   
    public Pais getPais() {
        return this.pais;
    }
   
    public void setPais(Pais pais) {
        this.pais = pais;
    }
}


The country Facade:

Code:
public class PaisFacade {
    public void savePais(Pais pais) {
        EntityManagerFactory emf = HibernateUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();
       
        transaction.begin();
        em.persist(pais);
        transaction.commit();
        em.close();
    }
   
    public Pais createPais(String nomePais){
        Pais pais = new Pais();
        pais.setNome(nomePais);
        savePais(pais);
       
        return pais;
    }

     public Pais findPaisByName(String nomePais) {
        EntityManagerFactory emf = HibernateUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        Query query = em.createQuery(
                "select pais " +
                "from  " +
                "Pais as pais " +
                "where  " +
                "pais.nome = ? ");
        query.setParameter(1, nomePais);
       
        Pais pais = (Pais) query.getSingleResult();
        em.close();
       
        return pais;
    }


}


The district facade:

Code:
public class DistritoFacade {
    public void saveDistrito(Distrito distrito, Long idPais) {
        EntityManagerFactory emf = HibernateUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();
       
        transaction.begin();
       
        Pais pais = (Pais) em.getReference(Pais.class, idPais);
        distrito.setPais(pais);
        em.persist(distrito);
       
        transaction.commit();
        em.close();
    }
   
    public Distrito createDistrito(String nome, Long idPais){
        Distrito distrito = new Distrito();
        distrito.setNome(nome);
        saveDistrito(distrito, idPais);
       
        return distrito;
    }
   
    public immo.persistence.Distrito findDistritoByName(String distritoNome) {
        EntityManagerFactory emf = HibernateUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        Query query = em.createQuery(
                " select distrito " +
                " from  " +
                " Distrito as distrito " +
                "  where  " +
                " distrito.nome = ? ");
        query.setParameter(0,distritoNome);
       
        Distrito distrito = (Distrito) query.getSingleResult();
        em.close();
       
        return distrito;
    }
}


The exception
When i run this piece of code, the elements are all inserted on the DB, but when im trying to the the list of districts of the Country (pais.getDistritos() ) i get an org.hibernate.LazyInitializationException:

Code:
public class Main {
   
    /** Creates a new instance of Main */
    public Main() {
    }

    public static void main(String[] args) {
        PaisFacade paisFacade = new PaisFacade();
        paisFacade.createPais("Portugal");
        paisFacade.createPais("Espanha");
        paisFacade.createPais("Italia");
       
        Pais portugal = paisFacade.findPaisByName("Portugal");
       
        DistritoFacade distritoFacade = new DistritoFacade();
        distritoFacade.createDistrito("Lisboa", portugal.getId());
        distritoFacade.createDistrito("Leiria", portugal.getId());
        distritoFacade.createDistrito("Viseu", portugal.getId());
        distritoFacade.createDistrito("Porto", portugal.getId());
        distritoFacade.createDistrito("Faro", portugal.getId());
        distritoFacade.createDistrito("Braga", portugal.getId());
       
        EntityManagerFactory emf = HibernateUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
       
54        List<Distrito> distritos = portugal.getDistritos();
55        for(Distrito distrito: distritos){
56            System.out.println("Distritos de Portugal: " + distrito.getNome());
57        }
       
        transaction.commit();
        em.close();
       
        HibernateUtil.closeEntityManagerFactory();
    }
}


The exception:
[b]
Hibernate:
select
pais0_.id_pais as id1_2_,
pais0_.nome_pais as nome2_2_
from
PAISES pais0_
where
pais0_.nome_pais=?
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: immo.persistence.Pais.distritos, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
at immo.Main.main(Main.java:55)
Java Result: 1
BUILD SUCCESSFUL (total time: 12 seconds)

Does any one know what am im missing, and wich part of the book of java persistence with hibernate should i read so i can understand it better and deeply?

thanks a lot
[b]


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.