Я работаю с Spring Roo 1.2.3 в проекте, и мне нужно создать новую запись другого объекта X, когда обновляется информация об объекте. Я бы сделал что-то вроде этого (похоже на триггерное обновление в базе данных).JPA PostUpdate с Spring Roo
@PostPersist
@PostUpdate
private void triggerStock() {
Calendar fechaActual = Calendar.getInstance();
Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();
StockHistory history = new StockHistory();
history.setArticulo(this.getArticulo());
history.setFecha(fechaActual);
history.setCantidad(cantidad);
history.persist();
}
При выходе из приложения этого метода выдает ошибку и не сохраняет новый элемент X.
Но если изменить последний метод, с помощью:
@PostPersist
@PostUpdate
private void triggerStock() {
Calendar fechaActual = Calendar.getInstance();
Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();
StockHistory history = new StockHistory();
history.setArticulo(this.getArticulo());
history.setFecha(fechaActual);
history.setCantidad(cantidad);
EntityManagerFactory emf = entityManager().getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.setFlushMode(FlushModeType.COMMIT);
em.persist(history);
em.getTransaction().commit();
em.close();
}
Это прекрасно работает , но я хотел бы понять, зачем мне нужен новый EntityManager для этого?
Спасибо ...
Кроме того, я нашел следующую информацию: «В общем, метод жизненного цикла переносимого приложения не должен вызывать операции EntityManager или Query, обращаться к другим экземплярам сущности или изменять отношения в одном и том же контексте персистентности. Метод обратного вызова жизненного цикла может изменять состояние отношения отношения к сущности, на которую он вызывается. "_ Http://www.theserverside.com/discussions/thread.tss?thread_id=61669 – Hector