Duvida Hibernate

4 respostas
M

Pessoal,

Tenho um objeto que tem uma coleção, insiro e atualizo sem problemas com o cascade.all, mas preciso que quando a coleção for inserida ele popule o atributo ID(primary key), pois como estou usando o postgresql ele está chamando a sequence e não atribui o valor da sequence no ID do objeto sem ter que fazer um novo find.

Como faço para ele ser atribuido?

Obrigado.

4 Respostas

Hebert_Coelho

Se ele está chamando a sequence e não está atualizando, tem coisa errada.

Tem como você postar apenas as classes com seus relacionamentos os IDs?

fagnermfarias

jakegrod, o código é esse:

A classe pai:

@Entity
@Table(name = "andamentos_processos")
public class AndamentoProcesso {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Long id;
	
	
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@OneToMany(mappedBy = "andamentoProcesso", cascade = CascadeType.ALL)
	private List<DocumentoAndamentoProcesso> documentos;
A classe filha
@Entity
@Table(name = "documentos_andamentos_processos")
public class DocumentoAndamentoProcesso {

	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="documentos_andamentos_processos_id")
	@SequenceGenerator(name="documentos_andamentos_processos_id", sequenceName="documentos_andamentos_processos_id_seq")
	private Long id;

    @ManyToOne
	@JoinColumn(name = "andamento_processo_id")
	private AndamentoProcesso andamentoProcesso;

Quando persisto a classe AndamentoProcesso ele persiste os filhos sem problemas... e logo depois eu já possuo o id de todos os filhos.

session.persist(this);
			
session.flush();

Já quando faço o merge ele também cadastra os filhos... tudo blz.... só que o id dos filhos ficam null.

entityRetorno = (T)session.merge(this);
			
session.flush();

Preciso do id do objeto para salvar o arquivo em disco com o id do objeto:

this.andamentoProcesso.update();
		
for(DocumentoAndamentoProcesso doc : this.andamentoProcesso.getDocumentos()){
			
	if(!TSUtil.isEmpty(doc.getDocumento())){
		
		doc.setArquivo(doc.getId() + ClasseUtil.obterExtensaoArquivo(doc.getArquivo()));
		ClasseUtil.criaArquivo(doc.getDocumento(), doc.getCaminhoUploadCompleto());
		
		doc.update();
	}
		
}

Obrigado.

Hebert_Coelho
  1. Classe pai e classe filha você tem quando B extends A. Nesse caso, A é pai de B.
  2. Todo relacionamento para ser considerado único tem que ter mappedBy. No seu caso, você deve colocar o mappedBy no OneToMany. Ele é o lado “fraco” da relação.

Tente alterar isso, se possível, apagar no banco de dados as tabelas e deixar que o hibernate crie novamente. Pois até então, deve ter campos a mais aí.

fagnermfarias

o mappeBy já está lá na classe AndamentoProcesso…

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) @OneToMany(mappedBy = "andamentoProcesso", cascade = CascadeType.ALL) private List<DocumentoAndamentoProcesso> documentos;

Criado 8 de agosto de 2012
Ultima resposta 9 de ago. de 2012
Respostas 4
Participantes 3