2013-11-28 102 views
0

你好朋友我正在遵循Spring + Hibernate + JPA。 我正在嘗試在我的數據庫上執行刪除操作。通過一個對象刪除作爲參數不工作

當我通過從控制器和Tha模型的對象做如下這是不工作

@Transactional(readOnly = false) 
@Override 
public void doDeleteCategory(Category deleteCategory) { 
    try { 
     entityManager.remove(deleteCategory); 
    } catch (Exception exc) { 
     logger.info(exc.getStackTrace().toString()); 
    } 
} 

但是,當我再次獲得相同的對象不是它的工作原理如下

@Transactional(readOnly = false) 
@Override 
public void doDeleteCategory(Category deleteCategory) { 
    Category category = retrieveCategory(deleteCategory.getCategoryId()); 
    try { 
     entityManager.remove(deleteCategory); 
    } catch (Exception exc) { 
     logger.info(exc.getStackTrace().toString()); 
    } 
} 

我好奇地知道爲什麼它發生,而創建和更新/合併工作完美時,我做了兩種方法相同。

這裏是棧跟蹤:

org.apache.catalina.core.ApplicationContext log 
INFO: Destroying Spring FrameworkServlet 'oltapp' 
Nov 28, 2013 1:46:36 PM org.apache.catalina.core.ApplicationContext log 
INFO: Closing Spring root WebApplicationContext 
Nov 28, 2013 1:47:14 PM org.apache.catalina.core.ApplicationContext log 
INFO: No Spring WebApplicationInitializer types detected on classpath 
Nov 28, 2013 1:47:14 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
Nov 28, 2013 1:47:25 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring FrameworkServlet 'oltapp' 
Nov 28, 2013 1:53:56 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [oltapp] in context with path [/oltapp] threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly] with root cause 
javax.persistence.RollbackException: Transaction marked as rollbackOnly 
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:72) 
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:392) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
at com.sun.proxy.$Proxy263.doDeleteCategory(Unknown Source) 
at co.softwarehouse.olt.service.category.CategoryServiceImpl.doDeleteCategory(CategoryServiceImpl.java:68) 
at co.softwarehouse.olt.web.controller.CategoryController.deleteCategory(CategoryController.java:98) 
at co.softwarehouse.olt.web.controller.CategoryController.processCategory(CategoryController.java:140) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:722) 
+1

可能它是分離的,那很好捕捉異常說什麼? – gadget

+0

@gadget事務回滾... –

+1

我敢打賭,你傳遞的是從你的控制器分離的實體,但爲了確保我需要看到完整的堆棧跟蹤...必須有一個原因,該堆棧跟蹤的某個地方trx回滾 – gadget

回答

0

merge整點是採取離散的實體和到它的狀態合併到一個附加的實體。很明顯,合併工作與分離的實體。

remove整點是採取一個附加的實體,並刪除它,所以你需要一個附加的實體將其刪除。 The javadoc是關於這個問題的明顯的:

無效刪除(java.lang.Object中實體)

卸下實體實例。

拋出:

  • - 如果實例不是一個實體或者是分離的實體

  • TransactionRequiredException - 如果上式PersistenceContextType.TRANSACTION的容器管理實體管理器調用並且沒有交易

(強調我的)

+0

JB Nizet ...超棒..我現在明白了。 –