首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法注入在EntityManager中声明的persistence.xml

无法注入在EntityManager中声明的persistence.xml
EN

Stack Overflow用户
提问于 2014-06-03 09:01:14
回答 2查看 3K关注 0票数 3

我正在尝试开发一个(基于Maven的) jar库,它可以作为Java应用程序的DAL。

这是我的persistence.xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

   <persistence-unit name="DALPersistenceUnit" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:app/env/MyDataSource</jta-data-source>          
      <shared-cache-mode>NONE</shared-cache-mode>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
      </properties>
   </persistence-unit>
</persistence>

这是DataSource定义,使用@DataSourceDefinition注释完成

代码语言:javascript
复制
import javax.annotation.sql.DataSourceDefinition;
import javax.ejb.Startup;


@DataSourceDefinition(name = "java:app/env/MyDataSource",
                      className = "com.mysql.jdbc.Driver",
                      serverName="<serverIP>",
                      portNumber=3306,
                      user = "<username>",
                      password = "<pwd>",
                      databaseName = "<dbname>",
                      minPoolSize = 0,
                      initialPoolSize = 0
                      )
@Startup
public class MyDataSource {

}

这是从EntityManager定义中检索persistence.xml的DAO (我使用QueryDSL简化查询定义)

代码语言:javascript
复制
package my.dal.dao;
import my.domain.dal.QUser;
import my.domain.dal.User;

import javax.enterprise.inject.Default;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

import com.mysema.query.jpa.JPQLQuery;
import com.mysema.query.jpa.impl.JPAQuery;

@Default
public class UserDAO {

    @PersistenceContext(unitName = "DALPersistenceUnit", type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    public User getMark()
    {
        QUser qUser = QUser.user;
        JPQLQuery query = new JPAQuery(entityManager);          
        User mark = query.from(qUser).where(qUser.username.eq("mark")).uniqueResult(qUser);
        return mark;
    }       
}

另外,我在beans.xml文件夹中添加了META-INF文件。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>

这是测试类(我使用CDI-单位进行CDI测试)

代码语言:javascript
复制
import my.dal.dao.UserDAO;
import my.domain.dal.User;
import static org.junit.Assert.assertTrue;
import javax.inject.Inject;
import org.jglue.cdiunit.CdiRunner;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(CdiRunner.class)
public class DALUserTest {

    @Inject UserDAO userDAO;

    @Test
    public void testGetMark()
    {
        User user = userDAO.getMark(); // Here I get a NullPointerException
        assertTrue(user.getUsername()=="mark");
    }
}

当我运行测试时,我在测试类的标线处得到一个NullPointerException。此外,如果调试测试,我可以看到UserDAO类的UserDAO字段是null,因此不会从persistence.xml文件中注入。

我是不是遗漏了Java持久性/CDI机制中的一些东西?

谢谢

编辑1:我已经将Maven依赖项添加到

代码语言:javascript
复制
querydsl-core:3.3.2
querydsl-apt:3.3.2
querydsl-jpa:3.3.2
log4j:1.2.16
mysql-connector-java:5.1.29
hibernate-entitymanager:4.3.1.Final
hibernate-validator:5.0.3.Final
cdi-unit:3.0.1
junit:4.11
javaee-api:7.0
hibernate-jpa-2.0-api:1.0.1.Final
hibernate-core:4.3.1.Final
hibernate-commons-annotations:4.0.4.Final

编辑2:在@beans.xm1文件中添加了以下bean定义

代码语言:javascript
复制
<bean id="entityManagerFactory" class="org.hibernate.jpa.internal.EntityManagerFactoryImpl">
    <property name="persistenceUnitName" value="DALPersistenceUnit" />
    <property name="persistenceXmlLocation" value="classpath*:/src/main/resources/META-INF/persistence.xml" />
</bean> 

但是我在beans.xml文件中得到了以下错误

2.4.a:找到以元素'bean‘开头的无效内容。{“http://java.sun.com/xml/ns/javaee”:拦截器之一,"http:// java.sun.com/xml/ns/javaee“:装饰符,”http://java.sun.com/xml/ns/javaee“:One }。

EN

回答 2

Stack Overflow用户

发布于 2014-06-03 10:57:29

您要配置数据源两次。在persistence.xml和通过@DataSourceDefinition

由于您没有在应用程序服务器中运行测试,所以需要自己制作一个EntityManager。一个好主意是使用EntityManagerProducer,它可以与运行测试的另一种方式进行切换。

代码语言:javascript
复制
@RequestScoped
public class EntityManagerProvider {

    @PersistenceContext
    private EntityManager entityManager;

    @Produces
    public EntityManager getEntityManager() {
        return entityManager;
    }

}

那么您需要一个制作人

代码语言:javascript
复制
@Alternative
@RequestScoped
public class EntityManagerProvider {


    private EntityManager entityManager;

    @Produces
    public EntityManager getEntityManager() {
        if(entityManager == null) {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("...");
            entityManager = emf.createEntityManager();
        }
        return entityManager;
    }

}

您可以通过这种方式访问EntityManager,@Inject private EntityManager em

票数 2
EN

Stack Overflow用户

发布于 2014-06-03 09:33:43

尝试在bean中创建entityManagerFactory并通过构造函数注入注入到DAO类中。

代码语言:javascript
复制
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
         <property name="persistenceUnitName" value="DALPersistenceUnit" />
        <property name="persistenceXmlLocation" value="classpath*:/<path-to>/persistence.xml" />
</bean> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24011055

复制
相关文章

相似问题

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