Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate-изменить поля бина после их заполнения


Автор: isabsent 7.6.2011, 15:44
Нужно выполнить метод в Entity, изменяющий поля Entity сразу после заполнения этих полей данными из таблицы - что-то похожее на @PostConstruct. Обнаружил похожую аннотацию @PostUpdate, но не нашёл в доках Hibernate её описания. Подскажите, кто сталкивался, когда она применяется и почему
Код

    @PostUpdate
    protected void doPostUpdate()
    {
        action();
    }
 
ничего не делает после заполнения полей данными из таблицы?

Автор: Embedded 7.6.2011, 16:05
isabsent, 
Вот callback'и с кратким описанием:

Цитата

@javax.persistence.PrePersist
@javax.persistence.PostPersist    Before and after persisting the object

@javax.persistence.PreUpdate
@javax.persistence.PostUpdate    Before and after updating the object attributes

@javax.persistence.PreRemove
@javax.persistence.PostRemove    Before and after removing the object

@javax.persistence.PostLoad    When the data of the object is loaded from database


Добавлено @ 16:11
Похоже тебе нужен PostLoad 
Обратный вызов PostLoad происходит после того, как данные для сущности считаны из базы данных, и экземпляр сущности создан.

п. с.
PreUpdate и PostUpdate
Обновления сущности могут произойти в любое время, как в пределах транзакции (в случае расширенного контекста персистентности) так и вне транзакции. Поскольку нет никакого явного метода у EntityManager, обратный вызов PreUpdate, гарантированно, будет вызван только в некоторый момент перед обновлением базы данных. Некоторые реализации могут отследить изменения динамически и могут вызвать обратный вызов на каждое изменение, в то время как другие могут ожидать до конца транзакции и только вызвать обратный вызов единажды.  

Автор: isabsent 7.6.2011, 16:26
Да, @PostLoad - это, похоже, то что надо! Но он не работает у меня почему-то... Не могу понять причину :( Как поставить breakpoint на метод, если его вызываю не я, а контейнер когда создаёт бины!?

P.S. Вы упоминаете EntityManager - скорее всего это из JPA? Но у меня он не используется, Spring напрямую связан с Hibernate. Может поэтому @PostLoad не работает?

Автор: Embedded 7.6.2011, 16:44
isabsent, 
ааа... ну тогда тебе сюда http://docs.jboss.org/hibernate/core/3.5/reference/en/html/events.html

А то @PostLoad это только для EntityManager (JPA) варианта.

п.с.
отредактировал ссылку, в адресе была ошибка

Автор: isabsent 7.6.2011, 17:14
Понял, спасибо! Хотелось чего-то просто в виде аннотации на метод. 
Почему из всех аннотаций
Код

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.PostLoad;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
 
у меня отказывается работать только javax.persistence.PostLoad ?

Автор: Embedded 7.6.2011, 17:25
isabsent, 
вот этого не знаю, знаю только что  @PostLoad (EJB3) не работает с SessionFactory 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)