Доброе утро в моем часовом поясе.Сделки и отладки объектов JPA
технологии: EJB 3.0 поставщик JPA -> (OpenJPA) Container -> WAS SNIPPET КОДА:
@Stateless(name = "ejb/BeanName")
public class A implements AInterface{
@PersistenceContext(unitName = "main")
private EntityManager emanager;
public String getData(D d){
try{
C c = new C();
F f = emanager.find(F.class,d.getId());(1)
f.setSomeData(c);(2)
getMethodTwo(d,f);(3)
}finally{
emanager.clear();(5)
}
}
public String getMethodTwo(D d,F f){
Query q = emanager.createNativeQuery("UPDATE ...");
q.executeUpdate();(4)
}
}
В моей компании проекта, я внесение изменений в этом фрагменте кода. Мои изменения заключались в создании метода «getMethodTwo» и его вызова (3). Проблема заключается в том, что в темпе (4) JPA генерирует исключение, потому что есть изменения в объекте «f», который был загружен через EntityManager (1), поэтому он привязан к контексту и потому что есть изменения, когда мы вызываем executeUpdate (4), JPA будет пытаться запускать SQL-инструкции изменений на объекте «f». Перед моими изменениями этот код работает, потому что есть финализация, которая очищает контекст персистентности (5). Я думаю, что это плохой способ кода. Я знаю, если я вызову entitymanager.clear(), прежде чем я вызову свой метод, он будет работать, но я думаю, что это неправильное решение и правильный способ использования JPA. Что мне делать ?
С наилучшими пожеланиями Заранее спасибо
Спасибо за ответ, но проблема в том, что если «сбросить» изменения, внесенные в объект «f», будут отправлены в базу данных с помощью операторов SQL (UPDATE AND INSERT), а объект «f» еще не подготовлен для использования в заявлении, потому что требуемые поля не заполнены полностью и исключается исключение CONSTRAINT NULL. Следует избегать FLUSH. – tt0686