【问题标题】:How to return result of transaction in JPA如何在 JPA 中返回交易结果
【发布时间】:2011-10-03 06:57:48
【问题描述】:

我只是一个背景,因为我在一个旧项目上工作以来习惯使用 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 也在生成此代码并返回“无效”。

@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 组件感到困惑,但我看到了它的好处。 我只是需要一些关于某些项目的建议。谢谢。

【问题讨论】:

    标签: java ejb-3.0 jpa-2.0


    【解决方案1】:

    容器会将异常传播给调用者(如果您在 EJB 中不对其进行任何操作)。我猜这可能是 SQLException 。您可以在 servlet 上捕获它并使用它做任何您想做的事情。如果您使用容器管理事务 (CMT),则容器将自动为您回滚事务,并且不会添加学生对象。正如您所说,您当然也可以将异常保留在 Web 层上,然后为其准备一个特殊的错误页面。一切都取决于您的使用场景。

    【讨论】:

    • 嗨,克里斯,这是一个很好的评论。比如说,我在 Ajax 请求中使用了这个 servlet,这是否意味着在这种情况下我应该用 Try/Catch 块包装它?我需要知道是否发生了异常,以便创建正确的 JSON 对象。这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2012-08-05
    • 2021-07-08
    相关资源
    最近更新 更多