Играть! Поведение после операции сохранения модели - PullRequest
0 голосов
/ 08 мая 2018

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

  • У меня есть прослушиватель для строки поведения вставки при обновлении / вставке объекта

DescriptionListener.java

public class DescriptionListener {
    @PostPersist
    public void onPostPersist(Object entity) {
        Description description = new Description("INSERT");
        description.save();
    }

    @PostUpdate
    public void onPostUpdate(Object entity) {
        Description description = new Description("UPDATE");
        description.save();
    }
}
  • У меня есть модель БД для слушателя

Description.java

@Entity
@Table(name="DESCRIPTION")
public class Description extends GenericModel {
    @Id
    @GeneratedValue
    @Column(name="ID")
    public Long id;
    @Column(name="INFO")
    public String info;

    public Description(String info) {
        this.info = info;
    }       
}
  • Я использую список объектов в классе, который хочу прослушать с аннотацией @EntityListener @Entity @EntityListeners(DescriptionListener .class) @Table(name="TABLE") public class Table extends GenericModel { ... } Но после того, как я проверил функциональность, я прочитал эти слова в документе:

Метод обратного вызова не должен вызывать методы EntityManager или Query!

Теперь я думаю, что метод save() - это метод Query, поэтому я не могу использовать его в функциях обратного вызова (но в моем случае он работает так же), и мой вопрос:

Как реализовать поведение того же типа и сохранить модель после сохранения другой модели?

Есть ли что-нибудь, что может помочь мне в игре?

Я следую этой документации: Слушатели сущностей и методы обратного вызова

1 Ответ

0 голосов
/ 21 мая 2018

Поддержка JPA в Play реализована с помощью улучшений байт-кода и JPAPlugin

Также, как вы знали, каждая сущность расширяет некоторые классы, как; JPABase.java

по операциям CRUD; JPABase передает событие в систему плагинов Play, например: JPASupport.objectUpdated.

Таким образом, вы можете написать собственный PlayPlugin для отслеживания этих событий и внесения некоторых других изменений.

Однако, ИМХО, вы должны следовать предложению гибернации и вносить изменения в новую транзакцию. Играть с прикрепленными сущностями после такого рода событий жизненного цикла - это всегда бремя. Подумайте об асинхронности и внесите изменения в другую транзакцию.

...