【发布时间】: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