Quatro soluções para LazyInitializationException

Classes de Modelo

No post te hoje iremos utilizar duas classe de modelo, Person e Dog:

package com.model;

import javax.persistence.*;

@Entity
public class Dog {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	private String name;

	public Dog() {

	}

	public Dog(String name) {
		this.name = name;
	}

	//get and set
}
package com.model;

import java.util.*;

import javax.persistence.*;

@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	private String name;

	@OneToMany
	@JoinTable(name = "person_has_lazy_dogs")
	private List<Dog> lazyDogs;

	public Person() {

	}

	public Person(String name) {
		this.name = name;
	}

	// get and set
}

Veja que com essas duas classes já é possível simular o erro LazyInitializationException. Temos a classe Person que tem uma lista de Dog.

Teremos também uma classe de persistência de dados (EJB) e um ManagedBean para nos ajudar a simular e mostrar o tratamento do erro:

package com.ejb;

import java.util.List;

import javax.ejb.*;
import javax.persistence.*;

import com.model.*;

@Stateless
public class SystemDAO {

	@PersistenceContext(unitName = "LazyPU")
	private EntityManager entityManager;

	private void saveDogs(List<Dog> dogs) {
		for (Dog dog : dogs) {
			entityManager.persist(dog);
		}
	}

	public void savePerson(Person person) {
			saveDogs(person.getLazyDogs());
			saveDogs(person.getEagerDogs());
			entityManager.persist(person);
	}

	// you could use the entityManager.find() method also
	public Person findByName(String name) {
		Query query = entityManager.createQuery("select p from Person p where name = :name");
		query.setParameter("name", name);

		Person result = null;
		try {
			result = (Person) query.getSingleResult();
		} catch (NoResultException e) {
			// no result found
		}

		return result;
	}
}
package com.mb;

import javax.ejb.EJB;
import javax.faces.bean.*;

import com.ejb.SystemDAO;
import com.model.*;

@ManagedBean
@RequestScoped
public class DataMB {

	@EJB
	private SystemDAO systemDAO;

	private Person person;

	public Person getPerson() {
		return systemDAO.findByName("Mark M.");
	}
}

42 Thoughts on “Quatro soluções para LazyInitializationException

  1. Salvou meu dia!

    Parabéns pelo artigo!

Comment navigation

 

Leave a Reply

Post Navigation