Можно ли сохранить новые сущности в прослушивателе @ Pre / PostPersist? - PullRequest
10 голосов
/ 27 декабря 2011

Я пытаюсь настроить мое приложение гибернации для сохранения новой сущности Notification каждый раз, когда создается Activity сущность - в настоящий момент все, что я пробовал Notification, просто не может сохраняться без вывода сообщений (ошибок влоги, но sql никогда не выполняется).

Может ли кто-нибудь подтвердить, что даже можно сохранить дополнительные сущности в прослушивателях Hibernate pre / postPersist?

Я прочитал в документации:

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

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

ДляДля справки, два подхода, которые я попытался сделать так:

  1. @PrePersist метод - установка отношения cascade.ALL между Activity и Notification, а в методе PrePersist просто созданиеновый Notification и связывание его с Activity, создаваемым в надежде, что Notification будет сохранен.

  2. @PostPersist метод - с использованием @Configurable aи ListenerClass, проводка в сервисе и создание нового объекта Notification, а затем явный вызов entityManger persist

Может ли кто-нибудь подтвердить, что я пытаюсь это сделать?

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Вы можете сохранить дополнительные объекты в прослушивателях событий Hibernate (вставка, обновление, очистка и т. Д.) С помощью интерфейса StatelessSession . Но я не знаю, возможно ли это и со строгим кодом только JPA (EntityManagerFactory и EntityManager).

2 голосов
/ 27 декабря 2011

Почему вы должны сохранять Notification в @PrePersist или @PostPersist функции?Следующий код должен сохранять обе сущности:

@Entity
public class Activity implements Serializable {
   @OneToOne(cascade={CascadeType.PERSIST})
   private Notification notification;
}

@Entity
public class Notification implements Serializable { }

@Stateless
public class MrBean implements MrBeanInterface {
   @PersistenceContext()
   private EntityManager em;

   public void persistActivity() {
      Activity act = new Activity();
      act.setNotification(new Notification());
      em.persist(act);
   }
}

ОБНОВЛЕНИЕ : вы можете попробовать создать ссылку в конструкторе Activity следующим образом:

@Entity
public class Activity implements Serializable {
   @OneToOne(cascade={CascadeType.PERSIST})
   private Notification notification;

   public Activity() {
      this.notification = new Notification();
   }
}

@Entity
public class Notification implements Serializable { }

@Stateless
public class MrBean implements MrBeanInterface {
   @PersistenceContext()
   private EntityManager em;

   public void persistActivity() {
      Activity act = new Activity();
      em.persist(act);
   }
}

обратите внимание, что я думаю, что вы не можете использовать @PostPersist.Чтобы быть более точным, вы должны связать Notification с Activity перед сохранением Activity, чтобы cascade={CascadeType.PERSIST} работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...