在这个程序中,我想通过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();
}
}
}
答案 0 :(得分:0)
好的,根据您提供的信息,if (transaction != null) transaction.commit();
行会抛出异常。否则,由于异常捕获条款,它将不会显示。
我想到的是,由于某些其他原因,uniqueResult()
调用抛出异常(现在将e.printStackTrace()
作为异常块中的第一行,只需对其进行静音就会阻止您知道发生了什么。
在捕获异常并回滚事务之后,执行继续执行finally块,该块尝试提交刚刚回滚的完全相同的事务。
如果您测试交易会更好,而不仅仅是检查null
。因此,测试if (transaction != null && transaction.isActive()) {...}
以检查您的交易参考是否有效。查看Hibernate reference。
我建议您在session
区块之外的transaction
和try
获取。这样,由异常处理块保护的语句将仅与业务逻辑操作相关,而不是与准备执行所需的代码相关。