问一个Hibernate的基础问题,一段代码很是不理解。《Java Persistence with Hibernate》PDF电子书的P473:
Session session = null;
Transaction tx = null;
try {
    session = sessionFactory.openSession();
    tx = session.beginTransaction();
    concludeAuction(session);
    tx.commit();
} catch (RuntimeException ex) {
    tx.rollback();
} finally {
    session.close();
}
......
//以下自已写的一个concludeAuction(Session)方法的实现
public void concludeAuction(Session session){
Item aItem = new Item("EJB3.0 in Action");
Bid bestBid  = new Bid(new java.math.BigDecimal(112.00));
aItem.setBestBid(bestBid);
session.save(aItem);
throw new RuntimeException("中止拍卖异常,由于付款失败!");
}有以下问题(本人使用Hibernate版本是3.2.6,在JavaSE环竟下运行此Hibernate应用程序):
1、为什么去掉以上代码的异常捕获代码块也能进行事务回滚?这个异常捕获不就是多余的吗?
2、为什么会有session is closed异常信息提示,我已经在Hibernate配置文件中配置了属性
hibernate.transaction.auto_close_session值为false,书上代码这么写不就是让commit()方法结束
之后或者rollback()方法结束之后不自动关闭Session对象吗?需要如何设置才能让事务结束之后不自动关闭
Session对象。又或者说Hibernate应用程序本身就一直应该让事务结束后关闭Session,否则会有异常现象发生?
3、电子书P473的一段话如何理解?最后一句的意思是什么?
We already talked about write-behind behavior, so you know that the bulk of SQL
statements are executed as late as possible, when the persistence context of the
Session is flushed. This happens when you call commit() on the Transaction, by
default. After you commit the transaction (or roll it back), the database connection 
is released and unbound from the Session. Beginning a new transaction with
the same Session obtains another connection from the pool. 我的翻译如下:我们已经讨论过Hibernate的迟写行为(write-behind)的特性,所以你知道:当Session持久化上下文被flush时,
Hibernate会尽可能迟地执行这些批量的SQL语句。默认情况下,当你在一个事务上调用commit方法时,持久化上下文的
flush操作执行。在你提交(commit)或回滚(rollback)事务后,这个与Session相关数据库连接会被释放且这个连接
会与Session取消绑定。若使用同样的Session来开始一个新的事务,这个事务会获得另外一个连接池中的连接。最后一句(Beginning a new transaction with the same Session obtains another connection from the pool. )
(1、第一种理解是:指“一个会话对象可以有多个事务吗?”,即如下代码一般可正常工作:
Session firstSession = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction firstTx = firstSession.beginTransaction();
......
firstTx.commit();//是否可以设置commit后,firstSession不关闭?
......
Transaction secondTx = firstSession.beginTransaction();//firstSession重新绑定池中另外一个连接?
......
secondTx.commit();
以上代码为什么为会出现Session is closed异常信息。
(2、第二种理解是:这句话只是想说明“同一个类型的会话可以有多个事务”,即下面两线程完全可正常地并发运行:
如(若有线程a和b及把上述所说的代码片段包装进CaveatEmptor类的soldByAuction()方法):
线程A中有代码行:
caveatEmptor.soldByAuction();//在里面开始一个事务
线程B上有代码行:
caveatEmptor.soldByAuction();//在里面开始一个新的事务4、如果在rollback方法或者commit方法中抛出异常,我们应该一般如何处理?