2013-05-29 1 views
2

Я работаю с 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 для этого?

Спасибо ...

ответ

1

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

В зависимости от того, какой поставщик JPA вы используете, есть способы заставить что-то записать из события, но вам нужно быть осторожным.

+0

Кроме того, я нашел следующую информацию: «В общем, метод жизненного цикла переносимого приложения не должен вызывать операции EntityManager или Query, обращаться к другим экземплярам сущности или изменять отношения в одном и том же контексте персистентности. Метод обратного вызова жизненного цикла может изменять состояние отношения отношения к сущности, на которую он вызывается. "_ Http://www.theserverside.com/discussions/thread.tss?thread_id=61669 – Hector

 Смежные вопросы

  • Нет связанных вопросов^_^