在一个事务中,当commit失败,能否获取当前失败对象

见下列代码,希各位解答.正困扰中...
[code="java"]
Session s = HibernateUtil.getCurrentSession();
s.clear();
Transaction t = s.beginTransaction();
try{

s.update(o);
s.update(o1);
s.delete(o2);
t.commit();

}
catch(Exception e) {
//当捕捉到异常时,能否知道是o,o1还是o2时失败?
t.rollback();
e.printStackTrace();
} finally {
s.clear();
HibernateUtil.closeSession();
}
[/code]

[code="java"]
session = sessionFactory.openSession(new EmptyInterceptor() {
public boolean onSave(Object entity, Serializable id,
Object[] state, String[] propertyNames, Type[] types) {
// TODO Auto-generated method stub

                if (entity instanceof UserInfo) {

                    System.out.println("准备添加用户:"
                            + ((UserInfo) entity).getName());

                }

                return false;
            }

            @Override
            public void onDelete(Object entity, Serializable id,
                    Object[] state, String[] propertyNames, Type[] types) {
                // TODO Auto-generated method stub
                if (entity instanceof UserInfo) {

                    System.out.println("准备删除用户:"
                            + ((UserInfo) entity).getName());

                }
                super.onDelete(entity, id, state, propertyNames, types);
            }

            @Override
            public boolean onFlushDirty(Object entity, Serializable id,
                    Object[] currentState, Object[] previousState,
                    String[] propertyNames, Type[] types) {
                // TODO Auto-generated method stub
                if (entity instanceof UserInfo) {

                    System.out.println("准备更新用户:"
                            + ((UserInfo) entity).getName());

                }
                return super.onFlushDirty(entity, id, currentState,
                        previousState, propertyNames, types);
            }

        });

[/code]

hibernate里的Interceptor应该可以满足你的需求。

在你的interceptor里,用个list保存那三个对象(要更新或删除的对象,并且顺序固定);

在onupdate 或者ondelete方法里分别删除操作的对象。

到该方法执行完后,检查这个list里的对象。

只要知道第一个对象,就知道是前一个对象在操作时发生异常了。

我不确定hibernate会不会调整delete 和 update执行的顺序。因为hibernate很多东西看的还不是很清楚。没spring来的爽快。