Hibernate - Não excluir

3 respostas
J

Olá,

estou iniciando com o hibernate e não estou conseguindo fazer o seguinte:

Preciso que quando um registro estiver relacionado com o outro, não seja permitido a exclusão.

Exemplo:

Pessoas
id x nome
1 pessoaUm
2 pessoaDois
3 pessoaTrês

endereço x id_pessoa
EndereçoUm 1
EndereçoDois 2
EndereçoTrês 3

Logo, se eu tentar excluir uma pessoa, não poderei, porque tenho um endereço relacionado.

Como fazer isso?

Agradeço a todos.

3 Respostas

Lavieri
public class Pessoa {
      //...outros fields...
      @OneToOne
      private Endereco endereco

      //getters and setters
     
     public Endereco getEndere() {
         return this.endereco;
     }
     public void setEndereco(Endereco endereco) {
         this.endereco = endereco
     }
     
     @PreRemove
     public void esteMetodoPodeTerQualquerNomeDesdeQueEstejaComAAnotacao() {
           if (this.getEndereco() != null)
                 throw new RuntimeException("Não é possivel apagar esta pessoa, pois ela tem um endereco");
           //vc pode fazer o que kizer aqui, ele vai executar isto sempre antes de executar um Delete para a entidade Pessoa
     }
}

vc só pode ter 1 método com essa anotação... e ela sera executada sempre antes de deletar

.........

vc pode ter 1 método para cada uma das anotações, essa anotações funcionam como gatilho, ou seja... elas são verificadas, no momento previsto pela anotação, servem tanto para validar a entidade, como para designar ações antes ou após ações com as entidades
@PrePersist //invocado sempre antes de Inserir uma entidade (ou seja comando sql INSERT)
@PostPersist //invocado sempre apos Inserir uma entidade 

@PreUpdate //invocado sempre antes da entidade ter seus dados atualizados (ou seja comando sql UPDATE)
@PostUpdate //invocada sempre apos a entidade ter seus dados atualizados

@PreRemove //invocado sempre antes de uma entidade ser deletada (ou seja comando sql DELETE)
@PostRemove //invocada sempre apos uma entidade ser deletada...

@PostLoad //invocado apos uma entidade ser carregada (ou seja comando sql SELECT)
//@PreLoad não existe

vc só pode ter 1 anotação de cada uma desta em sua entidade... porem o método que tem essa anotação, pode chamar varios outros métodos dentro da entidade, dando marge a muitas ações que podem ser feitas antes ou apos estas operações...

J

Olá, amigo.

Obrigado por responder, mas infelizmente testei aqui e não consegui fazer funcionar. Coloquei na minha entidade o @PreRemove, e fiz o debug, e infelizmente não chamou o metódo. :?

Posso estar fazendo algo de errado. Alguma outra sugestão?

Obrigado.

roassunca

Olá javahp.

Se você estiver utilizando arquivos XML para fazer o mapeamento O-R, você pode configurar cascade=“save-update” na sua coleção (por exemplo, set):

<hibernate-mapping>
   <class name="myexample.Endereco" table="endereco">

      <id name="id" type="long" column="id">
         <generator class="native"/>
      </id>

      <many-to-one
         name="pessoa"
         column="pessoa"
         class="myexample.Pessoa"
         not-null="true"
         foreign-key="fk_endereco_pessoa"/>

   </class>
</hibernate-mapping>
<hibernate-mapping>
   <class name="myexample.Pessoa" table="pessoa">

      <id name="id" type="long" column="id">
         <generator class="native"/>
      </id>

      <set name="enderecos" inverse="true" cascade="save-update">
      	<key column="pessoa"/>
      	<one-to-many class="myexample.Endereco"/>
      </set>

   </class>
</hibernate-mapping>

Dessa forma, o Hibernate vai atualizar (insert/update) a tabela Endereco apenas quando você estiver salvando ou atualizando uma Pessoa.
Quando você fizer um delete de Pessoa ele não vai propagar para Endereco e o banco de dados irá gerar um erro, pois Endereco irá ter uma foreign key para Pessoa.

Essa não é a melho solução, pois irá deixar que o banco de dados gere um erro, quando uma melhor solução seria se a aplicação ou o Hibernate fizesse essa verificação antes, mas também estou aprendendo hibernate, então se alguém souber de uma solução melhor…

Criado 22 de fevereiro de 2009
Ultima resposta 24 de fev. de 2009
Respostas 3
Participantes 3