struts2,spring,hibernate项目,我把事物配置在了action层
调用的是action中的这个方法
public void saveOrUpMb() {
if("".equals(materialBrowse.getMaterialBrowseId())){
materialBrowse.setMaterialBrowseId(null);
}
getObjectService().saveOrUpdateObj(materialBrowse);
// 0,所有部门
// 1,按部门
// 2,按人员
// 3,私有
Short s = materialBrowse.getBrowseScope();
//s为零的时候,不做任何处理,在查询的时候默认把所有的都查出来
// if (s == 0) {
//
// }
String str=Struts2Utils.getParameter("str");
JSONArray jsonArray = JSONArray.fromObject(str);
List<UdFile> uList=new ArrayList<UdFile>();

String mtId=materialBrowse.getMaterialBrowseId();

Criterion criteria=Restrictions.eq("id.fileId", mtId);
List<UdFile> udList=(List<UdFile>) getObjectService().findByCriteria(UdFile.class, criteria);
getObjectService().deleteAll(udList);

if (s == 1 || s==2) {
//文件id,部门id,类型1,

for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
String id = (String) jsonObject.get("id");
UdFileId udFileId=new UdFileId();
udFileId.setUdId(id);
udFileId.setFileId(mtId);
UdFile udFile=new UdFile();
udFile.setId(udFileId);
udFile.setType(s);
uList.add(udFile);
}


// else if (s == 2) {
// //文件id,人员ids,类型2
// } 
else {


//文件id,人员id,类型3
UdFileId udFileId=new UdFileId();
udFileId.setUdId(Struts2Utils.getUserId());
udFileId.setFileId(materialBrowse.getMaterialBrowseId());
UdFile udFile=new UdFile();
udFile.setId(udFileId);
udFile.setType(s);
uList.add(udFile);

}
getObjectService().batchSaveOrUpdate(uList); }
代码已经执行到getObjectService().batchSaveOrUpdate(uList);最后一行
spring中事物的配置
<aop:config  proxy-target-class="true">
        <aop:pointcut id="interceptorPointCuts"
            expression="execution(* com.ht.oa.*.action.*.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="interceptorPointCuts" />       
    </aop:config>     
是不是不能把事物配置在action层?应该怎么解决这个问题?

解决方案 »

  1.   

    控制台输出的信息
    >>> 2012-08-22 10:09:25,160 DEBUG [http-8080-8] (HibernateTemplate.java:397) - Found thread-bound Session for HibernateTemplate
    >>> 2012-08-22 10:09:25,161 DEBUG [http-8080-8] (AbstractBatcher.java:410) - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
    >>> 2012-08-22 10:09:25,162 DEBUG [http-8080-8] (SQLStatementLogger.java:111) - 
        select
            udfile_.ud_id,
            udfile_.file_id,
            udfile_.type as type106_ 
        from
            chinayxy.ud_file udfile_ 
        where
            udfile_.ud_id=? 
            and udfile_.file_id=?
    Hibernate: 
        select
            udfile_.ud_id,
            udfile_.file_id,
            udfile_.type as type106_ 
        from
            chinayxy.ud_file udfile_ 
        where
            udfile_.ud_id=? 
            and udfile_.file_id=?
    >>> 2012-08-22 10:09:25,170 DEBUG [http-8080-8] (AbstractBatcher.java:418) - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    >>> 2012-08-22 10:09:25,171 DEBUG [http-8080-8] (HibernateTemplate.java:422) - Not closing pre-bound Hibernate Session after HibernateTemplate
    >>> 2012-08-22 10:09:25,171 DEBUG [http-8080-8] (AbstractPlatformTransactionManager.java:857) - Participating transaction failed - letting transaction originator decide on rollback
    >>> 2012-08-22 10:09:25,183 DEBUG [http-8080-8] (AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback
    >>> 2012-08-22 10:09:25,184 DEBUG [http-8080-8] (HibernateTransactionManager.java:672) - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@183bddb]
    >>> 2012-08-22 10:09:25,185 DEBUG [http-8080-8] (JDBCTransaction.java:186) - rollback
    >>> 2012-08-22 10:09:25,186 DEBUG [http-8080-8] (JDBCTransaction.java:227) - re-enabling autocommit
    >>> 2012-08-22 10:09:25,187 DEBUG [http-8080-8] (JDBCTransaction.java:197) - rolled back JDBC Connection
    >>> 2012-08-22 10:09:25,188 DEBUG [http-8080-8] (ConnectionManager.java:325) - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
    >>> 2012-08-22 10:09:25,188 DEBUG [http-8080-8] (HibernateTransactionManager.java:741) - Not closing pre-bound Hibernate Session [org.hibernate.impl.SessionImpl@183bddb] after transaction
    >>> 2012-08-22 10:09:25,188 DEBUG [http-8080-8] (SessionImpl.java:402) - disconnecting session
    >>> 2012-08-22 10:09:25,190 DEBUG [http-8080-8] (ConnectionManager.java:464) - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
    >>> 2012-08-22 10:09:25,191 DEBUG [http-8080-8] (ConnectionManager.java:325) - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
    >>> 2012-08-22 10:09:25,192 DEBUG [http-8080-8] (CommonsLogger.java:68) - Checking ConfigurationProviders for reload.
    >>> 2012-08-22 10:09:25,225 DEBUG [http-8080-8] (Log4JLoggerFactory.java:81) - org/apache/struts2/dispatcher/error.ftl[zh_CN,UTF-8,parsed] using cached since jar:file:/D:/apache-tomcat-6.0.35/webapps/ChinaYXY/WEB-INF/lib/struts2-core-2.2.1.jar!/org/apache/struts2/dispatcher/error.ftl didn't change.
    >>> 2012-08-22 10:09:25,226 DEBUG [http-8080-8] (Log4JLoggerFactory.java:81) - Key 'location' was not found on instance of org.springframework.orm.hibernate3.HibernateSystemException. Introspection information for the class is: {rootCause=java.beans.PropertyDescriptor@4e97eefe, java.lang.Object@11d86b0={public void java.lang.Throwable.setStackTrace(java.lang.StackTraceElement[])=[Ljava.lang.Class;@637297, public boolean java.lang.Object.equals(java.lang.Object)=[Ljava.lang.Class;@f83159, public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()=[Ljava.lang.Class;@6fd9f1, public final native java.lang.Class java.lang.Object.getClass()=[Ljava.lang.Class;@14d7a29, public java.lang.String java.lang.Throwable.getLocalizedMessage()=[Ljava.lang.Class;@18f361c, public synchronized java.lang.Throwable java.lang.Throwable.initCause(java.lang.Throwable)=[Ljava.lang.Class;@12988dd, public native int java.lang.Object.hashCode()=[Ljava.lang.Class;@1d88fd2, public java.lang.String java.lang.Throwable.toString()=[Ljava.lang.Class;@ca4ae4, public java.lang.String org.springframework.core.NestedRuntimeException.getMessage()=[Ljava.lang.Class;@fafba9, public java.lang.Throwable org.springframework.core.NestedRuntimeException.getRootCause()=[Ljava.lang.Class;@1a042e9, public java.lang.Throwable java.lang.Throwable.getCause()=[Ljava.lang.Class;@88d90f, public synchronized native java.lang.Throwable java.lang.Throwable.fillInStackTrace()=[Ljava.lang.Class;@62a8af, public java.lang.Throwable org.springframework.core.NestedRuntimeException.getMostSpecificCause()=[Ljava.lang.Class;@1309f50, public boolean org.springframework.core.NestedRuntimeException.contains(java.lang.Class)=[Ljava.lang.Class;@12b4707}, getClass=public final native java.lang.Class java.lang.Object.getClass(), localizedMessage=java.beans.PropertyDescriptor@9baf4a54, cause=java.beans.PropertyDescriptor@e8d48042, getCause=public java.lang.Throwable java.lang.Throwable.getCause(), getMessage=public java.lang.String org.springframework.core.NestedRuntimeException.getMessage(), java.lang.Object@cec3d=freeer.ext.beans.SimpleMemberModel@444c5a, equals=public boolean java.lang.Object.equals(java.lang.Object), getRootCause=public java.lang.Throwable org.springframework.core.NestedRuntimeException.getRootCause(), hashCode=public native int java.lang.Object.hashCode(), class=java.beans.PropertyDescriptor@cf7bd2d9, contains=public boolean org.springframework.core.NestedRuntimeException.contains(java.lang.Class), mostSpecificCause=java.beans.PropertyDescriptor@c5149869, getMostSpecificCause=public java.lang.Throwable org.springframework.core.NestedRuntimeException.getMostSpecificCause(), fillInStackTrace=public synchronized native java.lang.Throwable java.lang.Throwable.fillInStackTrace(), stackTrace=java.beans.PropertyDescriptor@b3ca6b8, message=java.beans.PropertyDescriptor@2107370f, getStackTrace=public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace(), setStackTrace=public void java.lang.Throwable.setStackTrace(java.lang.StackTraceElement[]), toString=public java.lang.String java.lang.Throwable.toString(), initCause=public synchronized java.lang.Throwable java.lang.Throwable.initCause(java.lang.Throwable), printStackTrace=freeer.ext.beans.MethodMap@1f0cbb9, getLocalizedMessage=public java.lang.String java.lang.Throwable.getLocalizedMessage()}
    >>> 2012-08-22 10:09:25,228 DEBUG [http-8080-8] (Log4JLoggerFactory.java:81) - Key 'location' was not found on instance of org.hibernate.NonUniqueObjectException. Introspection information for the class is: {java.lang.Object@11d86b0={public void java.lang.Throwable.setStackTrace(java.lang.StackTraceElement[])=[Ljava.lang.Class;@142b4eb, public boolean java.lang.Object.equals(java.lang.Object)=[Ljava.lang.Class;@73be48, public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()=[Ljava.lang.Class;@d185ec, public java.io.Serializable org.hibernate.NonUniqueObjectException.getIdentifier()=[Ljava.lang.Class;@1af6511, public final native java.lang.Class java.lang.Object.getClass()=[Ljava.lang.Class;@147b73, public java.lang.String java.lang.Throwable.getLocalizedMessage()=[Ljava.lang.Class;@b4e311, public synchronized java.lang.Throwable java.lang.Throwable.initCause(java.lang.Throwable)=[Ljava.lang.Class;@1a782e4, public java.lang.String java.lang.Throwable.toString()=[Ljava.lang.Class;@824fca, public native int java.lang.Object.hashCode()=[Ljava.lang.Class;@1445d30, public java.lang.Throwable java.lang.Throwable.getCause()=[Ljava.lang.Class;@1421ac3, public synchronized native java.lang.Throwable java.lang.Throwable.fillInStackTrace()=[Ljava.lang.Class;@eb0943, public java.lang.String org.hibernate.NonUniqueObjectException.getEntityName()=[Ljava.lang.Class;@ad4cc0, public java.lang.String org.hibernate.NonUniqueObjectException.getMessage()=[Ljava.lang.Class;@18a00c8}, getClass=public final native java.lang.Class java.lang.Object.getClass(), getEntityName=public java.lang.String org.hibernate.NonUniqueObjectException.getEntityName(), localizedMessage=java.beans.PropertyDescriptor@9baf4a54, cause=java.beans.PropertyDescriptor@e8d48042, getCause=public java.lang.Throwable java.lang.Throwable.getCause(), getMessage=public java.lang.String org.hibernate.NonUniqueObjectException.getMessage(), java.lang.Object@cec3d=freeer.ext.beans.MethodMap@13986c1, equals=public boolean java.lang.Object.equals(java.lang.Object), hashCode=public native int java.lang.Object.hashCode(), class=java.beans.PropertyDescriptor@cf7bd2d9, fillInStackTrace=public synchronized native java.lang.Throwable java.lang.Throwable.fillInStackTrace(), stackTrace=java.beans.PropertyDescriptor@b3ca6b8, entityName=java.beans.PropertyDescriptor@5d490d76, message=java.beans.PropertyDescriptor@31d58849, getStackTrace=public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace(), setStackTrace=public void java.lang.Throwable.setStackTrace(java.lang.StackTraceElement[]), getIdentifier=public java.io.Serializable org.hibernate.NonUniqueObjectException.getIdentifier(), toString=public java.lang.String java.lang.Throwable.toString(), initCause=public synchronized java.lang.Throwable java.lang.Throwable.initCause(java.lang.Throwable), identifier=java.beans.PropertyDescriptor@d15b0a8e, printStackTrace=freeer.ext.beans.MethodMap@1be053a, getLocalizedMessage=public java.lang.String java.lang.Throwable.getLocalizedMessage()}
    >>> 2012-08-22 10:09:25,247 DEBUG [http-8080-8] (CommonsLogger.java:68) - skipping cleanup counter=1
    >>> 2012-08-22 10:09:25,247 DEBUG [http-8080-8] (OpenSessionInViewFilter.java:207) - Closing single Hibernate Session in OpenSessionInViewFilter
    >>> 2012-08-22 10:09:25,247 DEBUG [http-8080-8] (SessionFactoryUtils.java:789) - Closing Hibernate Session
      

  2.   

    没见过事物配置到action的,不过见仁见智啦,楼主,咋一看,看不出什么,建议debug在后台调试下嘛,看看哪里出错罗~
      

  3.   

    恩,还是debug仔细看下的好。
      

  4.   

    先检查NonUniqueObjectException,再检查HibernateSystemException。然后将事务配置到service层,然后再将逻辑压入service层,保持 action层很薄。然后成功后删除代码去看书!
    功力不到,切莫学习高级武功。
      

  5.   

    哥哥,真的谢谢您。
    好像跟事物的配置没关,我查了一下NonUniqueObjectException这个异常发生当你用session.load 或 session.get加载一个对象时 而又尝试着 
    session.update or session.lock 操作此对象
    我在getObjectService().deleteAll(udList);方法的后面加了如下代码
    getObjectService().getHibernateSession().flush();
    getObjectService().getHibernateSession().clear();
    之后就好了。
    还有是不是配置事物之后出现错误就不会在控制台输出?还是我的log4j配置的有问题?
    我如何把错误信息输出到控制台?
      

  6.   

    所有的问题只有一个答案:去看书
    顺便推荐几本
    《hibernate in action 2th》 《spring 揭秘》 《spring in action》