【问题标题】:JPA Entity is not updatedJPA 实体未更新
【发布时间】:2014-02-10 08:38:17
【问题描述】:

我在 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.
}

而 Session 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>

【问题讨论】:

  • 不,这不是事务问题,第一个实体的名称(Animal1)提交成功。
  • 您能粘贴您的持久性上下文设置吗?
  • 需要提交您未显示的事务。尝试将 em.flush 添加到合并中或显示更多信息,例如您如何将其连接到事务中,然后打开登录以查看发生了什么
  • 建议刷新不是为了解决问题,而是为了查看 EM 是否与事务相关联。如果不是,它将抛出异常。仅当 em 加入事务并且该事务提交时,才会获取更改,因此展示如何完成此操作非常重要。打开 EclipseLink 日志以查看它在做什么以及何时执行,因为这可能有助于您了解两个调用的不同之处。

标签: java jpa eclipselink entitymanager


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但是第一个“合并”方法(对于 id=1 )如何在不调用 flush 的情况下提交?第二种合并方法正在发生某些事情。
  • 我做到了,但两者都没有发现异常。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多