【发布时间】:2014-01-06 14:49:36
【问题描述】:
我对 JTA 事务范围如何与 servlet 调用交互感到困惑。假设我有下面的 servlet:
@WebServlet("/UpdateFooServlet")
public class UpdateFooServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject
private FooDAO fooDAO;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Foo foo = fooDAO.findById(Integer.parseInt(request.getParameter("id")));
foo.setName(request.getParameter("name"));
// Should the transaction flush/commit after this returns?
}
}
FooDAO 被注解为@Stateless,并且有一个使用@PersistenceContext 注入的EntityManager。 findById 只是调用 em.find 并返回匹配的 Foo。当我发布到 servlet 时,对 foo 对象的更新不会持久化到数据库中。
这是部署在 JBoss AS7 服务器上,使用内存中的 H2 数据库。我可以毫无问题地将 Foo 对象持久保存到数据库中,但更新令人困惑。我无法显式刷新实体管理器(即使我将 EntityManager 注入到 servlet 中,我也无法加入事务)。如果我两次 POST 到 servlet,我可以在控制台中看到更新 SQL,但如果我调用 servlet 一次则看不到。
【问题讨论】:
标签: hibernate jpa transactions jboss7.x jta