首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java-ee批处理作业中注入EntityManager null

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

Stack Overflow用户
提问于 2015-10-29 15:22:28
回答 1查看 508关注 0票数 0

我试图使用注入的实体管理器来使用java持久化批处理作业的输出,但是EntityManager始终是空的。我正在使用一个运行在glassfish上的Maven web应用程序,并按如下所示安排这项工作。

代码语言:javascript
复制
@Stateless
public class Scheduler {

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

在我的写作阶段

代码语言:javascript
复制
@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

代码语言:javascript
复制
<?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>

有谁知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 16:06:17

我不太清楚地记住规则,但是只有一组特定的类被保证扫描并使用JPA注释注入,并且批处理工件不包括在该列表中。

所以你必须做些其他的事情,比如:

代码语言:javascript
复制
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.mycompany_mavenproject1_war_1.0-SNAPSHOTPU");
 em = emf.createEntityManager();

或者你可以:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
    <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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33418231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档