Deletar registro no hibernate

2 respostas
M

Olá pessoal, sou iniciante em hibernate, gostaria de um help

Estou tentando deletar um registro de uma tabela e os relacionamentos.

Exemplo eu tenho a tabela Produto e a tabela Estoque. A tabela Estoque tem o id (foreing key) da tabela Produto. Quero que quando eu remove o registro na tabela Produto ele remova também da tabela Estoque. Já tentei de varias formas mas não consegui.

Se eu executar do jeito que está no exemplo a baixo ele da erro de violacão de constraint (ConstraintViolationException)

Segue as minhas entidades e minhas classes.

Essa é minha entidade Produto

@Entity

public class Produto {
	@Id
	@GeneratedValue
	private int id;
	private String nome;
	private String descricao;
	private String preco;
	private String desconto_max;
	private String comissao;
	@Temporal(TemporalType.DATE)
	private Date datAtivacao;
	@Temporal(TemporalType.DATE)
	private Date datDesativacao;

// metodos get e sets

Essa é minha entidade estoque

@Entity
public class Estoque {
	@Id
	@GeneratedValue
	private int id;
	private int quantidade;
	@Temporal(TemporalType.DATE)
	private Date datAtualizacao;
	@ManyToOne
	private Produto produto;

Meu Bean com o metodo excluir

public String excluir(){
		//Pega o objeto selecionado no DataTable
		produto = (Produto) objDataTableProduto.getRowData();
		//Cria a sessao com o banco e a trasacao
		Session session = HibernateUtil.getSession();
		Transaction t = session.beginTransaction();
		try{		
			session.delete(produto);
			t.commit();
			SessionUtil.addSuccessMessage("OperacaoSucesso");
		}catch (Exception e){
			t.rollback();
			SessionUtil.addErrorMessage("OperacaoFracasso");			
		}finally{
			session.close();
		}
		return null;
	}

2 Respostas

vitenho
public class Tes {
	void excluiProduto() {
		Produto p = null;// pega o produto de algum lugar
		// dao.excluiProduto(p);
	}

	void excluiProdutoNoDAo(Produto p){
		Produto exists = session.findById(p.getId());
		if(exists!=null){
			// nao precisa retirar da lista de produtos do estoque
			// a nao ser que nos produtos do estoque exista o cascade.ALL
			
			//mas aqui tem setar pra null
			exists.setEstoque(null);

			session.delete(exists);
		}else
			//deu merda
	}
}

class Produto {
	long id;
	String nome;
	@ManyToOne
	Estoque estoque;
}

class Estoque {
	long id;
	@OneToMany(mappedBy="estoque") // se aqui tivesse cascade tinha q tirar da lista quando deleta um produto
	List<Produto> produtos;
}
M

Amigo muitissimo obrigado por ter respondido, mas não consegui entender muito o seu codigo.

Primeiro ele não consegue identificar o código findById fala que tem que setar um objeto.

Segundo o relacionamento das suas entidades estao diferentes o meu, a entidade estoque que recebe o @ManyToOne e nao a produto. Precisa setar o relacionamento para produto na entidade produto? Porque referente a banco de dados as tabela estao assim:

Tabela Produto
ID
Nome
Descricao

Tabela Estoque
ID
Quantidade
Data
Produto_ID

Precisa setar na minha entidade produto o @OneToMany?

Criado 30 de julho de 2009
Ultima resposta 2 de ago. de 2009
Respostas 2
Participantes 2