Слушатели события Declaring Hibernate в среде JPA

Парни Hy,

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

Я считал, что должен объявить в Быть в спящем режиме конфигурационном файле *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 (с, в спящем режиме как конкретная реализация). Вы знаете, должен ли я создать тот определенный файл? Если да, куда я должен поместить его?

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

7
задан Arjan Tijms 25 July 2013 в 06:53
поделиться

4 ответа

В вашем 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>

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

6
ответ дан 6 December 2019 в 11:48
поделиться

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

Вы также можете определить всю свою конфигурацию спящего режима обычным способом : в файле hibernate.xfg.xml. Вы должны указать реализацию JPA {{1 }} для использования этого файла конфигурации с помощью свойства 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>

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

2
ответ дан 6 December 2019 в 11:48
поделиться

Я полагаю, вы используете аннотации? Если да, то вы можете использовать аннотацию @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 и т.д.

5
ответ дан 6 December 2019 в 11:48
поделиться

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

@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. Но аннотации, на мой взгляд, удобнее.

4
ответ дан 6 December 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: