Declaring Hibernate event listeners in a JPA environment

前端 未结 4 1963
陌清茗
陌清茗 2021-02-09 04:24

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 op

相关标签:
4条回答
  • 2021-02-09 04:59

    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.

    0 讨论(0)
  • 2021-02-09 05:08

    Note that you can also specify this with annotations on the callback methods. Either embed them in the entity itself, or in a separate class, called an entity listener. Here is a snippet taken from the documentation:

    @Entity 
    @EntityListeners(class=Audit.class)
    public class Cat {
    
        @Id private Integer id;
        private String name;
    
        @PostLoad
        public void calculateAge() {
           ...
        }
    }
    
    public class LastUpdateListener {
    
        @PreUpdate
        @PrePersist
        public void setLastUpdate(Cat o) {
            ...
        }
    }
    

    I guess you can also specify that in the XML config. But annotation are more convenient in my opinion.

    0 讨论(0)
  • 2021-02-09 05:09

    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.

    0 讨论(0)
  • 2021-02-09 05:15

    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.

    0 讨论(0)
提交回复
热议问题