2015-04-01 4 views
0

Доброе утро в моем часовом поясе.Сделки и отладки объектов 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. Что мне делать ?

С наилучшими пожеланиями Заранее спасибо

ответ

1

вы должны очистить состояние объекта в БД перед вызовом обновления.

emanager.flush(); 

и обновить свое состояние после операции

emanager.refresh(f) 
+0

Спасибо за ответ, но проблема в том, что если «сбросить» изменения, внесенные в объект «f», будут отправлены в базу данных с помощью операторов SQL (UPDATE AND INSERT), а объект «f» еще не подготовлен для использования в заявлении, потому что требуемые поля не заполнены полностью и исключается исключение CONSTRAINT NULL. Следует избегать FLUSH. – tt0686

0

исправить эту проблему с помощью аннотаций TransactionAttributeType NOT_SUPPORTED, так как метод просто сделать SELECT для заявления.