2014-01-20 2 views
2

Я использую Servlet-> EJB-> JPA на Glassfish 4. Приложение успешно развертывается.JPA Entity не обновляется

Когда я запускаю сервлет, он обновляет объект с id = 1 в db, но ничего не делает для него с id = 2. Исключено исключение.

@WebServlet("/AnimalServlet") 
public class AnimalServlet extends HttpServlet { 

@EJB AnimalDAOLocal lOBAnimalDAO; 

protected void doGet(....) { 
    Animal lOBAnimal = lOBAnimalDAO.getAnimal(1); // gets OK 
    lOBAnimal.setName("Animal1"); // sets OK 
    lOBAnimalDAO.mergeAnimal(lOBAnimal); // updates in DB OK 
    lOBAnimal = lOBAnimalDAO.getAnimal(2); // gets OK 
    lOBAnimal.setName("Animal2"); // sets OK 
    lOBAnimalDAO.mergeAnimal(lOBAnimal); // doesn't update in DB. 
} 

И сессия Методы Бобовой являются:

@Stateless(mappedName = "AnimalDAOMapped") 
public class AnimalDAO implements AnimalDAOLocal { 
    @PersistenceContext EntityManager em; 

    public Animal getAnimal(int id) { 
      return em.find(Animal.class, id); 
    } 

    public void mergeAnimal(Animal pOBAnimal) { 
      em.merge(pOBAnimal); 
    } 
} 

персистенция настройки устройства:

<persistence-unit name="JPATest" transaction-type="JTA"> 
    <jta-data-source>jdbc/animaltest</jta-data-source> 
    <class>net.test.model.Animal</class> 
</persistence-unit> 
+0

em.commit? 12345 – NicholasKarl

+0

Нет, это не проблема транзакции, имя первого лица (Animal1) успешно завершается. –

+1

[Это может помочь вам] (http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge) – Samy

ответ

0

Я решил проблему с помощью внушения Криса, чтобы включить EclipseLink Logging (который я не знал раньше).

Проблема возникла из-за неправильного определения @JoinColumn в сущности. И первая сущность (db = 1) совершалась случайно из-за существования фиктивных данных для этого идентификатора, которого нет для других идентификаторов.

0

Используйте flush(); метод бросить PersistenceException. Servlet поймать это исключение.

public void mergeAnimal(Animal pOBAnimal) throws PersistenceException { 
    try { 
     em.merge(pOBAnimal); 
     em.flush(); 
    } catch (PersistenceException pe) { 
     throw e; 
    } 
} 
+0

Спасибо, но как первый метод «слияния» (для id = 1) является фиксацией без вызова флеша? Что-то происходит именно по второму методу слияния. –

+0

Я сделал это, но на обоих не было исключений. –

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