Trigger com Hibernate ... Gatilho no Hibernate [RESOLVIDO]

11 respostas
L

Como criar gatilhos no hibernate ?? a muito tempo atraz, navegando pelas classes do hibernate… vi que ele não salva diretamente os dados… que da um fire para os ouvintes e um dos ouvintes que salva os dados… é possivel então usar o recurso de triggers diretamente pelo hibernate ?? sem ter que escrevelas em um banco de dados ??

algo com c fosse Listners ??

11 Respostas

L

Vc pode usar o conceito de EventListeners. Dá uma olhada no pacote org.hibernate.event

L

apenas para exemplificar um dos Cases é esse abaixo, onde eu preciso construir a lista de produtos para lojas, e uma tabela de estoque, sempre que eu adcionar 1 produto, ou adcionar 1 loja … queria fazer isso sem as Trigger do banco de dados… mas sim direatmente com códigos java

L

1 duvida… onde eu injeto os Listners ?? na session ?? no sessionFactory ?? onde??

caso seja no Session, tenho que fazelo para cada sessão criada ?? …

não achei os lugares para addOnDeleteListners… etc etc etc

L

procurei muito e so achei como fazer Interceptor… alguem sabe como fazer para adcionar um PreInsertEventListener por exemplo ??

L
Mais ou menos assim:
AnnotationConfiguration cfg = new AnnotationConfiguration();

		DBEventListener listener = new DBEventListener();

		EventListeners eventListeners = cfg.getEventListeners();
		eventListeners.setPostUpdateEventListeners(new PostUpdateEventListener[]{listener});
		eventListeners.setPostInsertEventListeners(new PostInsertEventListener[]{listener});
		eventListeners.setPostDeleteEventListeners(new PostDeleteEventListener[]{listener});


		factory = cfg.configure().buildSessionFactory();
L
LuksS:
Mais ou menos assim: ...
vlw ^^ ... mais me diz 1 coisa... tem como eu adcionar um Listner so em uma classe ?? tipo com anotações ?? vi algo assim
@Entity 
@EntityListeners(class=Audit.class)
public class Cat {
    @Id private Integer id;
    private String name;
    private Calendar dateOfBirth;
    @Transient private int age;
    private Date lastUpdate;
    //getters and setters

    /**
     * Set my transient property at load time based on a calculation,
     * note that a native Hibernate formula mapping is better for this purpose.
     */
    @PostLoad
    public void calculateAge() {
        Calendar birth = new GregorianCalendar();
        birth.setTime(dateOfBirth);
        Calendar now = new GregorianCalendar();
        now.setTime( new Date() );
        int adjust = 0;
        if ( now.get(Calendar.DAY_OF_YEAR) - birth.get(Calendar.DAY_OF_YEAR) < 0) {
            adjust = -1;
        }
        age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + adjust;
    }
}

public class LastUpdateListener {
    /**
     * automatic property set before any database persistence
     */
    @PreUpdate
    @PrePersist
    public void setLastUpdate(Cat o) {
        o.setLastUpdate( new Date() );
    }
}
nesse link aki http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/listeners.html

poeram ele fala ali de Audit.class .... e não sei bem como ele vai chamar o LastUpdateListner ... o.O

G

Há os listeners do hibernate que usam as anotações:

@PrePersist
@PreUpdate

@PostLoad
@PostPersist

e aí vai.

Para fazer chamada a sua classe de listener, basta na sua classe de entidade chamar: @EntityListeners(MinhaClasseListener.class)

Onde MinhaClasseListener não precisa implementar nenhuma interface específica para se comportar como uma listener trigger de hibernate.

L

Grinvon:

Para fazer chamada a sua classe de listener, basta na sua classe de entidade chamar: @EntityListeners(MinhaClasseListener.class)

Onde MinhaClasseListener não precisa implementar nenhuma interface específica para se comportar como uma listener trigger de hibernate.

como assim ?? e como ele vai chamar os métodos certos ??

como vou por exemplo implementar um Trigger de pré-insert por exemplo ?? … teria como vc escrever um pequeno código de exemplo ?? ou me mostrar 1 ?

G

Você viu as anotações??

Elas são que mostram o status da chamada que você desejar.

Exemplo, quero que toda operação de persistência, depois de persistir, ele envie um email

  • Na minha entidade eu faço ela enxergar a classe listener

@EntityListeners(MinhaClasseListener.class)
public class MinhaEntidade { … }

Dessa forma “MinhaClasseListener” se comportarar como um trigger.

Dentro dessa classe eu faço as chamadas necessárias:

@PostPersist @PostUpdate

public void persistir(MinhaEntidade pEntidade) {

//rotina enviar email



}
L

Perfeito ^^ vlw… resolveu o problema ^^

J

Sei que tópico é de 2009 mas to precisando fazer exatamente isso e não estou conseguindo... não funciona mais os listeners?

tentei fazer exatamente como falaram:

@EntityListeners(MinhaClasseListener.class) 
public class MinhaEntidade { ... } 

Dessa forma "MinhaClasseListener" se comportarar como um trigger. 

Dentro dessa classe eu faço as chamadas necessárias: 

@PostPersist @PostUpdate 
public void persistir(MinhaEntidade pEntidade) { 
//rotina enviar email 
...

mas nem se quer chamou o listner quando mandei dar save/update/remove.

Criado 17 de fevereiro de 2009
Ultima resposta 9 de fev. de 2012
Respostas 11
Participantes 4