Объявление слушателей событий Hibernate в среде JPA - PullRequest
7 голосов
/ 02 марта 2010

Hy, ребята,

Я работаю над проектом, разработанным в среде Java EE 5. Я хочу знать, как я могу объявить прослушиватель событий Hibernate, чтобы получать информацию о выполнении операции CRUD.

Я прочитал, что должен объявить в файле конфигурации Hibernate *cfg.xml что-то вроде этого:

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

Проблема в том, что у меня нет такого файла в проекте. Мы используем JPA (с Hibernate в качестве базовой реализации). Вы знаете, нужно ли мне создавать этот конкретный файл? Если да, куда мне его поставить?

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 02 марта 2010

В вашем постоянстве.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>

В документах Hibernate EntityManager посмотрите "Таблица 2.1. Специальные свойства Hibernate Entity Manager" для всех применимых свойств.

5 голосов
/ 02 марта 2010

Я полагаю, вы используете аннотации? Если это так, вы можете использовать аннотацию @EntityListeners для этого, например:

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

Ваш класс слушателя сущности может выглядеть так:

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);
    }

}

Существуют разные аннотации для захвата различных событий, например @PrePersist, @PreUpdate, @PostLoad и т. Д.

4 голосов
/ 02 марта 2010

Обратите внимание, что вы также можете указать это с аннотациями на методы обратного вызова. Либо встраивайте их в саму сущность, либо в отдельный класс, называемый слушателем сущности. Вот фрагмент, взятый из документации :

@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) {
        ...
    }
}

Полагаю, вы также можете указать это в конфиге XML. Но на мой взгляд, аннотации удобнее.

2 голосов
/ 02 марта 2010

Похоже, что вы можете указать hibnerate.cfg.xml как свойство hibernate.ejb.cfgfile.

Вы также можете определить все ваши спящие конфигурация в обычном Hibernate путь: в файле hibernate.xfg.xml. Вы должны сказать реализацию JPA использовать этот файл конфигурации через свойство hibernate.ejb.cfgfile.

См. этот пост или этот один.

<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>

Обратите внимание, что я никогда не использую это лично.

...