Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Spring и обработка событий в Hibernate

Anna | 3.06.2014 | нет комментариев

Как-то обделена на прогре такая тема, как обработка событий при работе с сущностями с применением Hibernate — я сумел обнаружить только один пост теснее примерно пушистого года. Но то аудит, а нам необходима вероятность автоматизировать работу с некоторыми признаками сущностей и при этом упростить процедуру работы с ними.

Для начала сделаем демонстрационный стенд с двумя сущностями User и AnObject, а так же DAO-слоем для них.

Код

Тут и дальше привожу только важные куски кода — в полной версии дозволено посмотреть на github

@Entity
@Table(name = "user")
public class User {
        @Id
        @GeneratedValue
        private long id;
        @Basic
        @Column(name = "username", updatable = false, unique = true, nullable = false)
        private String username;

        // getter and setter
}
@Entity
@Table(name = "anObject")
public class AnObject {
        @Id
        @GeneratedValue
        private long id;
        @Column
        private String value;

        // getter and setter
}


Добавим в сущность AnObject признак с двумя свойствами — дата последнего редактирования и автор правки:

Код

@Embeddable
public class LastModified {
        @Column
        @Temporal(TemporalType.TIMESTAMP)
        private Calendar lastUpdated;
        @OneToOne
        @JoinColumn(name = "lastEditor_id")
        private User lastEditor;

        // getter and setter
}
public interface LastModifiable {
        LastModified getLastModified();

        void setLastModified(LastModified modified);
}
@Entity
@Table(name = "anObject")
public class AnObject implements LastModifiable {
        @Id
        @GeneratedValue
        private long id;
        @Column
        private String value;
        @Embedded
        private LastModified lastModified;

        // getter and setter
}

И не позабудем исправить тестовый класс с учётом новшеств.

С этого момента у нас теснее есть всё нужное для внесения данных о дате/авторе изменений в ручном режиме, но… люди мы «ленивые», следственно давайте автоматизируем и эту работу — пускай за нас всюду это делает Hibernate. Для этого добавляем Listener и умоляем Hibernate его применять при происхождении события save либо update (commit):

Код

@Component
public class LastModifiedListener extends DefaultSaveOrUpdateEventListener {
        private transient static final Logger LOG = LoggerFactory.getLogger(LastModifiedListener.class.getName());

        @Autowired
        private UserDao userDao;

        @Override
        public void onSaveOrUpdate(SaveOrUpdateEvent event) {
                LOG.trace("object: {}", event.getObject());
                if (event.getObject() instanceof LastModifiable) {
                        LastModified lastModified = new LastModified((User) userDao.get(2));
                        ((LastModifiable) event.getObject()).setLastModified(lastModified);
                        LOG.trace("object: {}", event.getObject());
                }
                super.onSaveOrUpdate(event);
        }
}
@Component
public class HibernateEventWiring {
        @Autowired
        private SessionFactory sessionFactory;

        @Autowired
        private LastModifiedListener lastModifiedListener;

        @PostConstruct
        public void registerListeners() {
                EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
                        EventListenerRegistry.class);

                registry.getEventListenerGroup(EventType.SAVE_UPDATE).prependListener(lastModifiedListener);
        }
}


Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB