Hibernate - mapeamento bidirecional one-to-many

4 respostas
quikkoo

estou com um putta problema, fazia um bom tempo q eu ñ ultilizava o hibernate, e a ferrugem tá me corroendo, nas versões anteriores a 3.5 eu nunca tive problemas como esse, confesso q ñ sei se deve ao fato das mudanças no hibernate 3.5, ou da versão “eu 2010” hehe (que é o mais provável)

o lance é q ñ consigo ter acesso aos dados em uma coleção relacionada a uma entidade, pior q isso ainda, a coleção nem é instanciada apesar de esta definido assim eu sua declaração, sendo assim eu também ñ consigo inserir, alterar ou remover entidades filhas, o mapeamento many-to-one tem funcionado, consigo alterar qlqr entidade pai, mas eu to esquecendo de algo em meu “simples” mapeamento que ñ faz com que o relacionamento seja bidirecional

o cenário é simlpes, dentre os relacionamentos deste tipo que tenho vo exemplificar com um bem simples: equipamentos podem ter 0 ou N peças, peças podem pertencer a 0 ou 1 equipamento, segue abaixo os mapeamentos (resumidos)

<hibernate-mapping package="nome.do.pacote">
	<class name="Equipamento">

		<id name="id" type="java.lang.Long">
			<generator class="increment" />
		</id>

		<set name="pecas" inverse="true" cascade="save-update">
			<key column="equipamento" />
			<one-to-many class="nome.do.pacote.Peca" />
		</set>

	</class>
</hibernate-mapping>
<hibernate-mapping package="nome.do.pacote">
	<class name="Peca">

		<id name="id" type="java.lang.Long">
			<generator class="increment" />
		</id>

		<many-to-one name="equipamento" class="nome.do.pacote.Equipamento" />

	</class>
</hibernate-mapping>

na classe Equipamento a coleção é instanciada em sua declaração

public class Equipamento extends Model
{
	private Set<Peca> pecas = new TreeSet<Peca>();
}

mas durante a execução o variável ‘peca’ tem valor null, e mesmo eu instanciando novamente os dados ñ persistem, oq me faz pensar que o hibernate está ignorando essa propiedade, provavelmente pq eu ñ disse a ele de forma correta que ela existe e como deve se comportar

por enquanto, nesse projeto, ñ tive nenhum relacionamento many-to-many, mas pode ser q esse mesmo problema ocorra também, então gostaria quem alguém me ajudasse q resolver esse problema e também se possível me desse uma explicação da besteira que eu to fazendo

t+

4 Respostas

L

quikko, voce poderia tentar isto

pois assim quando você recuperar o equipamento o hibernate já recupera as peças por meio de um join. O padrão para esta opção é "select ". Com o “select” o hibernate só recupera a informação se você tentar acessar, mas se por algum motivo você tiver fechado a sessão vai dar erro na hora de recuperar os dados. Não sei se é esse seu caso mas provavelmente com o join as peças serão recuperadas.

quikkoo

cara, eu já havia tentado isso antes e ñ deu certo, li e reli o cap. 22 (q é um exemplo simples como o meu caso) da documentação e ñ consigo acha onde tá a encrenca

tentei outro recurso aqui, fazer as assossiações com junções, também seguindo a excelentíssima documentação, mas aconteceu o mesmo, ou seja, nada!
ñ gostaria de resolver isso com junções, pois antes eu ñ precisava delas para esse tipo de relacionamento, mesmo assim vou postar a tentativa

<hibernate-mapping package="nome.do.pacote.model">
	<class name="Peca">

		<id name="id" type="java.lang.Long">
			<generator class="increment" />
		</id>

		<join table="equipamentopecas" inverse="true" optional="true">
			<key column="peca" />
			<many-to-one name="equipamento" />
		</join>

	</class>
</hibernate-mapping>
<hibernate-mapping package="nome.do.pacote.model">
	<class name="Equipamento">

		<id name="id" type="java.lang.Long">
			<generator class="increment" />
		</id>

		<set name="pecas" table="equipamentopecas" inverse="true">
			<key column="equipamento" />
			<many-to-many column="peca" class="nome.do.pacote.Peca" />
		</set>

	</class>
</hibernate-mapping>

oq me deixa intrigado é fato da colação ‘pecas’ ñ ter sido instanciada na criação de um objeto Equipamento, em ambas as situações
de qualquer forma fica aí mais uma tentativa de resolver pra quem mais puder (e quizer) ajudar…

t+

Guevara

Olá!
Eu faço esse tipo de relação usando anotações (tenho alergia a xml hehe) vou postar o código aqui para vc usar se quiser:

public class equipamento {
// outros atributos
@OneToMany(targetEntity=Peca.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "equipamento",orphanRemoval=true)	
	public List<Peca> pecas; 
// getters e setters e método construtor completo, além de método construtor vazio, isso é importante
}
public class Peca {
// outros atributos
@ManyToOne
	private Equipamento equipamento;	
	
	public Imovel getEquipamento() {
		return equipamento;
	}
	public void setEquipamento(Equipamento equipamento) {
		this.equipamento = equipamento;
	}
// getters e setters e método construtor completo, além de método construtor vazio, isso é importante
}

Essas anotações com certeza funcionam, pois estou usando aqui.
Abraço!

quikkoo

usar anotações ñ é uma solução viável nesse caso, acabaria gerando outro problemas, mas de já está sendo considerada essa alternativa pois é melhor resolver um problema gerando outros doq ficar parado sem uma solução, pode ser tb q eu faça experimentações com uma versão antiga do hibernate

…por enquando fica vago oq poderia estar errado no projeto

obrigado pela ajuda, quem mais quizer da pitaco fica avontade, t+

Criado 6 de maio de 2010
Ultima resposta 7 de mai. de 2010
Respostas 4
Participantes 3