我在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>
答案 0 :(得分:0)
使用flush();
方法,抛出PersistenceException
。Servlet
捕获该异常。
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不存在。