只是一个背景,因为我在一个旧项目上工作,所以习惯使用 JDBC。 保存到数据库时,对于任何不成功的插入,我总是将值设置为 -1
public class StudentDao{
//This dao method returns -1 if unsuccessful in saving
public int save(Student stud){
Statement st = con.createStatement();
try{
int val = st.executeUpdate("INSERT student VALUES(.......)");
}catch(Exception e){
return -1;
}
}
}
根据返回结果,我可以判断插入是否成功,以便我可以执行准确的逻辑。 (告诉用户交易未完成...)
现在,我在持久化实体中使用了 EJB。我看到的大多数教程都只有这种结构。 Netbeans 生成的代码也带有“void”返回值。
@Stateless
public class StudentFacade{
@PersistenceContext(unitName = "MyDBPU")
private EntityManager em;
public void save(Student student){
em.persist(student);
}
}
在 servlet 上保存实体时,它只需调用如下代码所示的方法。
@WebServlet(name = "StudentServlet",
loadOnStartup = 1,
urlPatterns = {
"/addStudent",})
public class StudentServlet extends HttpServlet {
@EJB
private StudentFacade studentFacade;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//extract HTTP form request parameters then set
Student stud = Util.getStudent(request);
studentFacade.save(stud);
}
}
但是我怎么知道插入是否成功呢? (不要捕获异常然后让它传播。 我已经配置了我的错误页面,所以显然这会捕获错误???)
抱歉,我对集成 EJB 组件感到困惑,但我看到了它的好处。 我只需要一些关于某些项目的建议。谢谢。
最佳答案
容器会将异常传播给调用者(如果您不在 EJB 内对其执行任何操作)。我猜这可能是 SQLException。您可以在 servlet 上捕获它并用它做任何您想做的事情。如果您使用容器管理事务 (CMT),容器将自动为您回滚事务,并且不会添加学生对象。正如你所说,你当然也可以将异常保留在Web层上,然后为其准备一个特殊的错误页面。一切取决于您的使用场景。
关于java - 如何在JPA中返回交易结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7631899/