JPA PostUpdate с помощью Spring Roo
Я работаю с Spring Roo 1.2.3 над проектом, и мне нужно создать новую запись другой сущности X, когда обновится сущность Stock. Я хотел бы сделать что-то вроде этого (похоже на триггер обновления в базе данных).
@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 для этого?
Спасибо...
1 ответ
PostUpdate вызывается во время фиксации, модуль персистентности уже определил, что изменилось и что ему нужно записать, так что уже слишком поздно что-то менять (тогда ему нужно будет пересчитать то, что ему нужно для повторной записи).
В зависимости от того, каким провайдером JPA вы пользуетесь, есть несколько способов заставить что-то записываться из события, но вы должны быть осторожны.