2012-05-10 5 views
3

Я пытаюсь сделать такой метод, ошибка возникла при проблемах с параллелизмом .. похоже, что мой метод обновления не увеличивает атрибут @Version моего объекта Entity.Как реализовать общий метод saveOrUpdate с EclipseLink и JPA2

Мой код так:

 @Transactional 
     public B save(B bean) { 
     if (bean == null || bean.getId() == null) { 
      persist(bean); 
     } else { 
      bean = update(bean); 
     } 
     return bean; 
     }  

     protected final B update(B bean) { 
     bean = em().merge(bean); 
     em().flush(); 
     return bean; 
     } 

Это кусок кода моего AbstractDao. Метод em() возвращает EntityManager, которым управляет Guice-Persist.

Кроме того, я использую eclipselink.

заранее спасибо

ответ

1

я решить ее с помощью следующего кода:

protected final void persist(B bean) { 
    em().persist(bean); 
} 

protected final B update(B bean) { 
    bean.setVersion(findById(bean.getId()).getVersion()); 
    bean = em().merge(bean); 
    em().flush(); 
    return bean; 
} 

@Transactional 
public B save(B bean) { 
    if (bean == null || bean.getId() == null) { 
     persist(bean); 
    } else { 
     bean = update(bean); 
    } 
    return bean; 
} 
+1

Я не уверен, что это отличная идея. Номер версии может быть значительно устаревшим, когда этот поток прочитал его, и теперь вы вручную переписываете его самой последней версией, хотя это может быть законно устарело. Вместо этого вы можете просто использовать em.merge() для всех случаев в Save и вернуть управляемый объект, который он возвращает для изменений. Если у вас проблемы с версией, попробуйте найти объект, используя find, прежде чем вносить изменения, а не использовать устаревшую отдельную копию. – Chris

+0

Хмм, у вас есть пример кода для этого? Благодарю. – caarlos0

+0

Я забыл сказать, что это веб-приложение, поэтому я использую сеанс-за-запрос и DTO ... – caarlos0

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