JPA实体未更新

时间:2014-01-20 23:48:57

标签: java jpa eclipselink entitymanager

我在Glassfish 4上使用Servlet-> EJB-> JPA。应用程序已成功部署。

当我运行servlet时,它会更新db中id = 1的实体,但不会对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.
}

会话Bean方法是:

@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>

2 个答案:

答案 0 :(得分:0)

使用flush();方法,抛出PersistenceExceptionServlet捕获该异常。

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

答案 1 :(得分:0)

我在克里斯建议打开EclipseLink Logging(我以前不知道)的帮助下解决了这个问题。

问题发生的原因是实体中的@JoinColumn定义错误。并且第一个实体(db = 1)是偶然提交的,因为此id的虚拟数据存在,而其他id不存在。