如何使用hibernate标准按手机号码搜索

时间:2017-07-31 17:37:52

标签: java hibernate jsp servlets

在这个程序中,我想通过mobileNumber获取详细信息。当我们来到Customer customer = (Customer)cr.uniqueResult();(第28行)时,它会直接进入catch块并抛出此异常:

  

线程中的异常" main" org.hibernate.TransactionException:   交易未成功启动   org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)     在com.TestByGSTNumber.main(TestByGSTNumber.java:36)

public class TestByNumber {

    public static void main(String[] args) {

        Configuration cfg=new Configuration();
        cfg.configure("com/util/hibernate.cfg.xml");
        SessionFactory factory=null;
        Session session=null;
        Transaction transaction=null;
        try{
            session =  SessionFinder.getSession();
            transaction = session.beginTransaction();
            Criteria cr = session.createCriteria(Customer.class);
            cr.add(Restrictions.eq("mobileNumber","12345"));
           Customer customer= (Customer)cr.uniqueResult();
            System.out.println("value"+customer.getCity());


        }catch(Exception e){
            if(transaction  != null)transaction.rollback();
        }
        finally{
            if(transaction!=null)transaction.commit();;
            session.flush();
        }

    }

}

1 个答案:

答案 0 :(得分:0)

好的,根据您提供的信息,if (transaction != null) transaction.commit();行会抛出异常。否则,由于异常捕获条款,它将不会显示。

我想到的是,由于某些其他原因,uniqueResult()调用抛出异常(现在将e.printStackTrace()作为异常块中的第一行,只需对其进行静音就会阻止您知道发生了什么。

在捕获异常并回滚事务之后,执行继续执行finally块,该块尝试提交刚刚回滚的完全相同的事务。

如果您测试交易会更好,而不仅仅是检查null。因此,测试if (transaction != null && transaction.isActive()) {...}以检查您的交易参考是否有效。查看Hibernate reference

我建议您在session区块之外的transactiontry获取。这样,由异常处理块保护的语句将仅与业务逻辑操作相关,而不是与准备执行所需的代码相关。