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]