繁体   English   中英

在Java-ee批处理作业中注入EntityManager null

[英]Injected EntityManager null in java-ee batch job

我正在尝试使用注入的实体管理器来使用java-ee持久化批处理作业的输出,但是EntityManager始终为null。 我正在使用在glassfish上运行的Maven Web应用程序,并按以下方式安排作业。

@Stateless
public class Scheduler {

    @Schedule(minute = "*/1", hour = "*")
    public void runEveryMinute() {
        JobOperator jobOperator = BatchRuntime.getJobOperator();        
        jobOperator.start("newOrderProcessJob", null);     
    }
}

在我的作家一步

@Named
public class OrderWriter extends AbstractItemWriter {

    @PersistenceContext()
    EntityManager em;

    @Override
    public void writeItems(List<Object> list){

        for (Object p : list) {                
            em.merge(p);
        }
    }
}

还有我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
   <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
       <persistence-unit name="com.mycompany_mavenproject1_war_1.0-SNAPSHOTPU" transaction-type="JTA">
       <jta-data-source>jdbc/directory</jta-data-source>
       <exclude-unlisted-classes>false</exclude-unlisted-classes>
       <properties>
           <property name="javax.persistence.schema-                      generation.database.action" value="create"/>
       </properties>    
   </persistence-unit>
</persistence>

有谁知道如何解决这个问题?

我不记得确切的规则,但是只能保证使用该JPA注释扫描和注入特定的类集,并且该列表中不包含批处理工件。

因此,您必须执行其他类似的操作:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.mycompany_mavenproject1_war_1.0-SNAPSHOTPU");
 em = emf.createEntityManager();

或者您可以这样做:

@Named
@PersistenceContext(unitName = "com.mycompany_mavenproject1_war_1.0-SNAPSHOTPU", name = "persistence/em")
public class OrderWriter extends AbstractItemWriter {

    EntityManager em;

    @Override
    public void open(Serializable checkpoint) {
        try {
            InitialContext ic = new InitialContext();
            em = (EntityManager) ic.lookup("java:comp/env/persistence/em");
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void writeItems(List<Object> list){

        for (Object p : list) {                
            em.merge(p);
        }
    }
}

使用web.xml:

    <persistence-context-ref>
            <persistence-context-ref-name>persistence/em</persistence-context-ref-name>
            <persistence-unit-name>com.mycompany_mavenproject1_war_1.0-SNAPSHOTPU</persistence-unit-name>
    </persistence-context-ref>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM