Annotation @LazyCollection

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

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 !

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;
 	}