如何使用methode afterJob在db中插入数据

时间:2015-05-22 09:34:14

标签: spring hibernate spring-batch

在我的应用程序中,我必须在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]

3 个答案:

答案 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);