Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPA中返回交易结果_Java_Ejb 3.0_Jpa 2.0 - Fatal编程技术网

Java 如何在JPA中返回交易结果

Java 如何在JPA中返回交易结果,java,ejb-3.0,jpa-2.0,Java,Ejb 3.0,Jpa 2.0,这只是一个背景,因为我在一个老项目上工作时就习惯了使用JDBC。 当保存到数据库时,对于任何不成功的插入,我总是将值设置为-1 public class StudentDao{ //This dao method returns -1 if unsuccessful in saving public int save(Student stud){ Statement st = con.createStatement(); try{

这只是一个背景,因为我在一个老项目上工作时就习惯了使用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层上,然后为其准备一个特殊的错误页面。这一切都取决于您的使用场景。

嗨,克里斯,这是一个很好的评论。比如说,我在Ajax请求中使用了这个servlet,那么这是否意味着在这种情况下我应该用Try/Catch块来包装它?我需要知道是否发生了异常,以便创建正确的JSON对象。这是正确的吗?