@ManyToMany + Atributos na Terceira Tabela

6 respostas
eliasfsjunior

Galera, estou com um problema em um relacionamento many-to-many com atributos na terceira tabela. Já vi vários textos na internet e até mesmo aqui no GUJ, mas não estou conseguindo fazer um findAll() na terceira tabela. Minha dúvida é a seguinte: Tenho uma classe MercadoBean e outra ProdutoBean, a ideia é que terceira tabela/classe MercadoProduto tenha o relacionamento entre elas mais o preço de cada produto em cada mercado. Vi esse exemplo nesse site: http://www.wbotelhos.com/2011/12/06/hibernate-relacionamento-manytomany-com-atributos

O erro que acontece é hibernate.LazyInitializationException: could not initialize proxy. Porque acontece esse erro? Essa modelagem/abordagem está correta? Alguém tem alguma opinião para melhorar ou ajudar?

método findAll();

@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
public List<T> findAll() {
	logger.info("Find All" + persistentClass);
	return (getHibernateTemplate().find("from " + persistentClass.getName()
	+ " x"));
}

MercadoBean

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "mercado_id")
private Integer id;
	
@Column(name = "mercado_nome", length = 50)
private String nome;
	
@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL)
private List<MercadoProduto> produto;

// Getters and setters

ProdutoBean

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "produto_id")
private Integer id;
	
@Column(name = "produto_nome", length = 50)
private String nome;
	
@OneToMany(mappedBy = "mercado", cascade = CascadeType.ALL)
private List<MercadoProduto> mercado;

// Getters and setters

MercadoProduto

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "merc_prod_id")
private Integer id;
	
@Column(name = "merc_prod_preco")
private Double preco;
	
@ManyToOne
@JoinColumn(name = "merc_prod_mercado_id")
private MercadoBean mercado;
	
@ManyToOne
@JoinColumn(name = "merc_prod_produto_id")
private ProdutoBean produto;

// Getters and setters

6 Respostas

Hebert_Coelho

Esse erro não tem nada haver com o relacionamento.

Veja esse post que explica o problema e soluções: Quatro soluções para LazyInitializationException.

eliasfsjunior

Hebert Coelho:
Esse erro não tem nada haver com o relacionamento.

Veja esse post que explica o problema e soluções: Quatro soluções para LazyInitializationException.

Uia Hebert! Muito bom esse material! Já conhecia sua página! Parabéns pelo trabalho!

Vou dar uma olhada nas soluções e depois mostro o resultado para compartilhar com o pessoal! :smiley:

eliasfsjunior

Valeu Hebert! =D
Era só ter colocado “fetch = FetchType.EAGER” lá no @OneToMany! rs rs

Hebert_Coelho

eliasfsjunior:
Valeu Hebert! =D
Era só ter colocado “fetch = FetchType.EAGER” lá no @OneToMany! rs rs
uhum.

Bem, essa é a mais simples mas eu não a considero a melhor.

Com o tempo essa solução pode trazer problemas de desempenho e outras coisas a mais.

Caso teu problema não tenha muitos dados essa opção se mantém numa boa. [=

eliasfsjunior

Sim, eu percebi isso.
Fazendo o teste aqui, eu percebi que se deixar em EAGER o Hibernate faz 7 consultas usando left outer join. Se eu deixar como LAZY ele também faz 7 consultas, mas são consultas simples, sem usar left outer join. Não estou muito preocupado com desempenho agora, pois ainda estou aprendendo a usar a framework, estou fazendo isso para um trabalho de faculdade.

Agora, 7 consultas simples, são mais rápidas do que 7 consultas usando left outer join, certo? Se sim, seria mais interessante usar LAZY?

Hebert_Coelho

eliasfsjunior:
Sim, eu percebi isso.
Fazendo o teste aqui, eu percebi que se deixar em EAGER o Hibernate faz 7 consultas usando left outer join. Se eu deixar como LAZY ele também faz 7 consultas, mas são consultas simples, sem usar left outer join. Não estou muito preocupado com desempenho agora, pois ainda estou aprendendo a usar a framework, estou fazendo isso para um trabalho de faculdade.

Agora, 7 consultas simples, são mais rápidas do que 7 consultas usando left outer join, certo? Se sim, seria mais interessante usar LAZY?

Pois é, lá no post fala sobre e vantagem e desvantagem de cada abordagem.

Você vai ter que abraçar uma e seguir em frente. [=

Criado 1 de novembro de 2012
Ultima resposta 3 de nov. de 2012
Respostas 6
Participantes 2