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 вы пользуетесь, есть несколько способов заставить что-то записываться из события, но вы должны быть осторожны.

Другие вопросы по тегам