Java JPA实体未更新

Java JPA实体未更新,java,jpa,eclipselink,entitymanager,Java,Jpa,Eclipselink,Entitymanager,我在Glassfish4上使用Servlet->EJB->JPA。应用程序成功部署 当我运行servlet时,它会在db中更新id=1的实体,但不会对id=2的实体执行任何操作不会引发异常。 @WebServlet("/AnimalServlet") public class AnimalServlet extends HttpServlet { @EJB AnimalDAOLocal lOBAnimalDAO; protected void doGet(....) { Animal

我在Glassfish4上使用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>

jdbc/animaltest
net.test.model.Animal
使用
flush()PersistenceException
Servlet
捕获该异常

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

在Chris的建议下,我解决了这个问题,打开了EclipseLink日志记录(我以前不知道)


出现此问题的原因是实体中的@JoinColumn定义错误。第一个实体(db=1)是偶然提交的,因为该id存在其他id不存在的伪数据

不,这不是事务问题,第一个实体的名称(Animal1)已成功提交。能否粘贴您的持久性上下文设置?需要提交您未显示的事务。尝试将em.flush添加到合并中,或显示更多信息,例如如何将其挂接到事务中,并打开日志以查看发生了什么情况建议flush不是为了解决问题,而是为了查看em是否与事务关联。如果不是,它将抛出异常。只有当em加入到一个事务并且该事务提交时,才会拾取更改,因此展示如何完成这一点很重要。打开EclipseLink日志以查看它正在做什么以及什么时候做,因为这可能会帮助您查看这两个调用的不同之处。谢谢,但是第一个“merge”方法(对于id=1)是如何在不调用flush的情况下提交的?在第二个合并方法上确实发生了一些事情。我做到了,但在这两个方法上都没有发现异常。