Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate-изменить поля бина после их заполнения 
:(
    Опции темы
isabsent
Дата 7.6.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
Embedded
Дата 7.6.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



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, гарантированно, будет вызван только в некоторый момент перед обновлением базы данных. Некоторые реализации могут отследить изменения динамически и могут вызвать обратный вызов на каждое изменение, в то время как другие могут ожидать до конца транзакции и только вызвать обратный вызов единажды.  

Это сообщение отредактировал(а) Embedded - 7.6.2011, 16:16
PM MAIL   Вверх
isabsent
Дата 7.6.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) isabsent - 7.6.2011, 16:40
PM MAIL   Вверх
Embedded
Дата 7.6.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



isabsent, 
ааа... ну тогда тебе сюда http://docs.jboss.org/hibernate/core/3.5/r...tml/events.html

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

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


Это сообщение отредактировал(а) Embedded - 7.6.2011, 16:54
PM MAIL   Вверх
isabsent
Дата 7.6.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

Репутация: нет
Всего: нет



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

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 ?
PM MAIL   Вверх
Embedded
Дата 7.6.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



isabsent, 
вот этого не знаю, знаю только что  @PostLoad (EJB3) не работает с SessionFactory 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.