Problema persistência utilizando Hibernate+JPA

2 respostas
F

Pessoal, estou com alguns problemas na hora de gravar objetos que tenham relacionamentos.

Tenho duas classes : ClasseA e ClasseB
A ClasseA tem um relacionamento OneToMany com a ClasseB, e esse relacionamento é bidirecional. Sendo assim, as duas classes ficariam assim:

@Table(name = "TabelaA")
public class ClasseA {

	@Id
	@GeneratedValue
	@Column(nullable = false)
	private Integer id = null;

	@OneToMany(mappedBy="objetoA", cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
	private List<ClasseB> objetosB = null;


       ...


}

@Table(name = "TabelaB")
public class ClasseB {

	@Id
	@GeneratedValue
	@Column(nullable = false)
	private Integer id = null;

       @ManyToOne(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
	private ClasseA objetoA = null;

       ...


}

Neste caso a TabelaB terá um campo referente ao id da TabelaA.

Quando eu vou gravar um objeto da ClasseA, que tenha uma lista de Objetos da ClasseB, não faz a gravação no banco deste relacionamento, mas parece que fica em memória.
Mesmo após o commit(), não é gravado no banco o id na coluna referente ao relacionamento na TabelaB.

Se alguém puder me ajudar a resolver este problema eu agradeço !

2 Respostas

m0ska

Exatamente o que o colega escreveu, isto acontece, pq tem que ser garantida a integridade dos objetos, se um objeto agrega outro, e é um relacionamento bi-direcional, então o outro tem que agregar o primeiro objeto também, pra não existirem objetos com referências soltas, ou erradas…

Um exemplo é o de uma classe motor e uma carro, um carro agrega motor e um motor agrega carro, daí eu troco de motor, mas o motor ainda referencia o mesmo carro, olha o problema… é como se um carro ficasse com dois motores.

Por isso se recomenda o uso de relacionamentos bi-direcionais, quando necessário, caso contrário utilize relacionamentos unidirecionais.

:shock:

Victor_Yuji_Maehira

Bom dia Felipe!
Enfrentei situações semelhantes!
No meu caso, eu criei uma referência do objeto da ClasseA no objeto da ClasseB e funcionou:

Sendo que classeB está contido na collection de classeA. Isso tudo antes de dar o commit()!
Se for apenas um problema de referência, talvez ajude!

Criado 2 de maio de 2007
Ultima resposta 2 de mai. de 2007
Respostas 2
Participantes 3