Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Declaring Hibernate event listeners in a JPA environment

Hy guys,

I am working on a project developed in Java EE 5 environment. I want to know how I can declare a Hibernate event listener so that I can be informed when CRUD operation are performed.

I've read that I must declare in the Hibernate configuration file *cfg.xml something like this:

<hibernate-configuration>
    <session-factory>
        ...
        <event type="load">
            <listener class="com.eg.MyLoadListener"/>
            <listener class="org.hibernate.event.def.DefaultLoadEventListener"/>
        </event>
    </session-factory>
</hibernate-configuration>

The problem is I don't have such a file in the project. We are using JPA (with Hibernate as the underlying implementation). Do you know if I need to create that specific file? If yes where should I put it?

Thanks in advance.

like image 594
user284400 Avatar asked Mar 02 '10 13:03

user284400


3 Answers

In your persistence.xml:

<persistence>
    <persistence-unit name="myPersistenceUnit">
        ...
        <snip/>
        ...
        <properties>
            <property name="hibernate.ejb.event.load" value="com.eg.MyLoadListener,org.hibernate.event.def.DefaultLoadEventListener"/>    
        </properties>
    </persistence-unit>
</persistence>

In the Hibernate EntityManager docs look at "Table 2.1. Hibernate Entity Manager specific properties" for all applicable properties.

like image 125
mtpettyp Avatar answered Oct 15 '22 02:10

mtpettyp


I assume you are using annotations? If so, you can use the @EntityListeners annotation to do that, like so:

@MappedSuperclass
@EntityListeners(AbstractEntityListener.class)
public abstract class AbstractEntity {
    ...
}

Your entity listener class could look like this:

public class AbstractEntityListener {

    /**
     * Set creation and lastUpdated date of the entity.
     * 
     * @param entity {@link AbstractEntity}
     */
    @PrePersist
    @PreUpdate
    public void setDate(final AbstractEntity entity) {
        final Date now = new Date();
        entity.setModified(now);
    }

}

There are different annotations available to catch different events, like @PrePersist, @PreUpdate, @PostLoad, etc.

like image 36
Henning Avatar answered Oct 15 '22 00:10

Henning


It seems like you can specific the usual hibnerate.cfg.xml as a property hibernate.ejb.cfgfile.

You may also define all your hibernate configuration in the usual Hibernate way: within a hibernate.xfg.xml file. You must tell the JPA implementation to use this configuration file through the hibernate.ejb.cfgfile property.

See this post or this one.

<persistence>
 <persistence-unit name="manager1" transaction-type="JTA">
    <jta-data-source>java:/DefaultDS</jta-data-source>
    <properties>
       <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
    </properties>
 </persistence-unit>
</persistence>

Note that I never use that personally.

like image 28
ewernli Avatar answered Oct 15 '22 02:10

ewernli