2013-05-15 3 views
1

Я использую Hibernate 4.1.10.Final как поставщик jpa (с весенним контейнером), и я пытаюсь обновить объект jpa после его сохранения, но каждый раз, когда я получаю org.hibernate.StaleObjectStateException с сообщением: Row был обновлен или удален другая сделка (или несохраненное значение отображения было неправильной): ... моего код очень прост:Не удается обновить объект JPA после сохранения?

@Transactional 
public void test() { 
    TestEntity e = new TestEntity(); 
    e.setName("test"); 
    ...... 
    em.persist(e); 
    ...... 
    e.setComment("memo..."); 
} 

есть ли что случилось? Большое спасибо за вашу помощь.

+0

Кстати, класс TestEntity имеет поле версии: @version \t @Column (имя = «Обновление», вставляемый = ложь) \t частный Timestamp обновленный; – smile

ответ

0

Мы столкнулись с той же проблемой, и решение, которое мы нашли, поставить создание объекта в другой транзакции, но проблема в том, что мы не можем откатить создание :-(

Если кто-то есть Лучшее решение для предложения, мне тоже интересно!

1

Идти в эту же проблему - с использованием JPA 2.0 (Hibernate 4.2.4.Final/Spring 3.2.8.RELEASE) Единственный способ, с помощью которого до сих пор был отделить объект , найти его еще раз, а затем обновить его например

e = new E(); // assume E has @ID int id; 
    em.persist(e); 
    em.detach(e); 
    e = em.find(e.getId()); 
    e.setFoo('foo'); 
    .. 

Над работой, но ее взломать. По крайней мере, это может быть откат

+0

Обновление: Моя проблема заключалась в том, что у меня была @Version на отметке Timestamp, которая материализовалась как колонка Timingamp mysql 5.6. Изменение определения на Timestamp (3) облегчило необходимость выше взлома. Теперь мы можем безопасно выполнить em.persist(), за которым следует e.setFoo ('foo'); – user5842

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