Annotation @LazyCollection

2 respostas
A

Galera,

Tem o seguinte mapeamento:

@Entity
@Table(name="pedido")
public class Pedido {

	private Long id;
	private Set<Produto> produtos;
	
	
	public Pedido(){
		produtos = new HashSet<Produto>();
	}
	
	public Pedido(Set<Produto> produtos) {
		super();
		this.produtos = produtos;
	}

	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	@OneToMany(mappedBy="pedido",cascade=CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public Set<Produto> getProdutos() {
		return produtos;
	}
	
	public void setProdutos(Set<Produto> produtos) {
		this.produtos = produtos;
	}
	
	public void addProduto(Produto produto){
		getProdutos().add(produto);
	}
	
	
}

Mas a collection de produtos não esta sendo carregada automatica.

E fica dando a exception : org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

Alberto

Alberto

2 Respostas

muldon

Amigo, ja me deparei com esse tipo de problema a alguns meses atras. Tente uma coisa: coloque um break point no momento que vc chama a colecao de produtos e tente dar um system out nessa colecao, iterando ela. Acho que com isso o Hibernate ira inicialisa-la antes de exibi-la na tela, sendo assim vc a tera na tela. Outra maneira é usar o Initialize do hibernte, ex

Iterator it = produtos.iterator();

while (it.hasNext()) {

ProdutoTO pro = (ProdutoTO ) it.next();

Hibernate.initialize(pro);

}

Veja se da certo, abraco !

Guilherme_Moreira

Eu acho que você deve tirar a anotação LazyInitialization e colocar mais um parâmetro na @OneToMany, o “fetch=FetchType.EAGER” ficando assim:

@OneToMany(mappedBy="pedido",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
 	@LazyCollection(LazyCollectionOption.FALSE)
 	public Set<Produto> getProdutos() {
 		return produtos;
 	}
Criado 16 de janeiro de 2007
Ultima resposta 16 de jan. de 2007
Respostas 2
Participantes 3