在我的应用程序中,我必须在db中插入somme数据,这个数据contian在Job的ExitStatut中, 我的代码是
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecutionContext.get(ConstantesApps.TRACE) != null) {
Trace trace = (Trace)jobExecutionContext.get(ConstantesApps.TRACE);
trace.setHeureFinTraitement(jobExecution.getEndTime());
trace.setCodeRetour(getCodeRetour(jobExecution));
traceRepository.update(trace);
}
}
我有这个例外:
javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:993) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final]
at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_31]
at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_31]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:342) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE]
at com.sun.proxy.$Proxy29.flush(Unknown Source) ~[na:na]
at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) ~[na:na]
答案 0 :(得分:1)
以下我写的代码,为我工作 -
在您的主类中 - 将您的应用程序上下文加载到静态变量中 - APP_CONTEXT
如果您没有使用基于XML的方法 - 然后通过自动连接获取dataSource,然后您可以使用下面的代码 -
Connection conn = null;
PreparedStatement pstmt= null;
try {
DataSource dataSource = (DataSource) Main.APP_CONTEXT
.getBean("dataSource");
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(" your SQL query to insert ");
pstmtMstr.executeQuery();
} catch (Exception e) {
}finally{
if(pstmt!=null){
pstmt.close();
}if(conn!=null){
conn.close();
}
}
答案 1 :(得分:0)
异常消息非常清楚 - 您在事务边界之外调用此代码。在执行此代码或在单独的线程中执行afterJob
之前,您已提交或回滚了事务。
在这两种情况下,您都需要定义执行afterJob
的事务上下文。
答案 2 :(得分:0)
您正在直接调用traceRepository.update(trace);
,它可能是一个Spring @Repository
bean,但未使用@Transactional
注释。
相反,您可以调用一些使用@Transactional
注释的服务方法。从该Service方法中,您可以调用将在事务上下文中运行的traceRepository.update(trace);
。