Java 如果一个事务在多个到不同表的事务中失败,在hibernate中是否可以回滚?
我有一个方法:Java 如果一个事务在多个到不同表的事务中失败,在hibernate中是否可以回滚?,java,hibernate,Java,Hibernate,我有一个方法: // methods private void transform(TransformList transformList) { TableA tA = transformList.getTableA(); TableB tB = transformList.getTableB(); TableC tC = transformList.getTableC(); daoObj.saveA(tA); daoObj.saveB(
// methods
private void transform(TransformList transformList) {
TableA tA = transformList.getTableA();
TableB tB = transformList.getTableB();
TableC tC = transformList.getTableC();
daoObj.saveA(tA);
daoObj.saveB(tB);
daoObj.saveC(tC);
}
现在,
同样地
//saveB mehtod
public void saveB(TableB tB) {
Session session = Context.getHibernateSession();
try {
if(session != null) {
Transaction tx = session.beginTransaction();
tx.begin();
session.merge(tB);
tx.commit();
}
}catch (Exception e) {
tx.rollback();
throw new SomeException(e.getMessage());
}
finally{
if (session != null) {
session.clear();
}
}
}
以及
现在在调用“transform”方法时,如果saveA和saveB方法成功,那么
saveC方法中发生异常,是否可以回滚TableA和TableB记录
(已提交的)以及TableC记录?否。您必须将事务处理至少提高一个级别:创建事务,并在该事务中调用saveA()、saveB()和saveC()。不要在save方法内处理事务
当然,这只是一种可能性。有一些框架,比如Spring,可以极大地帮助您管理事务。那么我应该将common Session对象也传递给所有3种方法吗?如果您需要它(从代码上看,它看起来像它),是的,您必须将Session作为参数传递,但如果我使用PreparedStatement并在方法saveB中执行批处理更新,那么是否也可以同时回滚TableA和TableB?我这里没有使用Spring或EJB。只有在一个事务中更新(或插入或删除)的所有内容都将回滚时才使用Hibernate。但是请记住,只有数据库中的数据才会回滚。您对Java对象所做的更改将不会生效。如果我使用单个会话更新到多个表中,并且数据量很大,会话是否有可能溢出?
//saveB mehtod
public void saveB(TableB tB) {
Session session = Context.getHibernateSession();
try {
if(session != null) {
Transaction tx = session.beginTransaction();
tx.begin();
session.merge(tB);
tx.commit();
}
}catch (Exception e) {
tx.rollback();
throw new SomeException(e.getMessage());
}
finally{
if (session != null) {
session.clear();
}
}
}
//saveC mehtod
public void saveC(TableC tC) {
Session session = Context.getHibernateSession();
try {
if(session != null) {
Transaction tx = session.beginTransaction();
tx.begin();
session.merge(tC);
tx.commit();
}
}catch (Exception e) {
tx.rollback();
throw new SomeException(e.getMessage());
}
finally{
if (session != null) {
session.clear();
}
}
}