@PersistenceContext注入EntityManager

时间:2016-06-23 13:02:29

标签: java jpa jboss

我正在调查此EntityManager tutorial,我了解您可以在EM中描述您的persistence.xml或使用注释。 所以我创建了类似于这个类的东西:

package org.superbiz.injection.jpa;

import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;
import java.util.List;

@Stateful
public class Movies {

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

    public void addMovie(Movie movie) throws Exception {
        entityManager.persist(movie);
    }

    public void deleteMovie(Movie movie) throws Exception {
        entityManager.remove(movie);
    }

    public List<Movie> getMovies() throws Exception {
        Query query = entityManager.createQuery("SELECT m from Movie as m");
        return query.getResultList();
    }
}

我有例外:

    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011047: Component class com.epam.rudenkov.controller.BookStore for component com.epam.rudenkov.controller.BookStore has errors: 
JBAS011440: Can't find a persistence unit named movie-unit in deployment \"book_store.war\""}}

问题:

  • 我是否应该同时创建persistence.xml
  • 什么是unitName

2 个答案:

答案 0 :(得分:1)

  
    

我知道您可以在persistence.xml中描述您的EM或使用注释。

  

这不准确。您可以通过persistence.xml配置持久性上下文 - 用于构造 EntityManagerFactory 。顾名思义,它是一个用于创建Entity Manager实例的工厂。

通过@PersistenceContext注释将持久性上下文( EntityManager )注入EJB。

  
    

我是否应该创建persistence.xml?

  

是的,这在使用JBoss AS时是必需的。

来自WildFly 8 JPA参考指南(但一般适用):

persistence.xml包含持久性单元配置(例如数据源名称),并且如JPA 2.0规范(第8.2节)中所述,其META-INF目录包含persistence.xml文件的jar文件或目录称为根持久性单位。在Java EE环境中,持久性单元的根必须是以下之一(直接引自JPA 2.0规范):

  • EJB-JAR文件
  • WAR文件的WEB-INF / classes目录
  • WAR文件的WEB-INF / lib目录中的jar文件
  • EAR库目录中的jar文件
  • 应用程序客户端jar文件
  
    

unitName是什么?

  

(可选)persistence.xml文件中定义的持久性单元的名称。如果指定了unitName元素,则可在JNDI中访问的实体管理器的持久性单元必须具有相同的名称。

所以你必须在persistence.xml中拥有诸如<persistence-unit name="movie-unit">之类的东西。

请注意,如果您配置了单个持久性单元,则unitName不是必需的。

答案 1 :(得分:0)

您可以在 mapping.xml (非persistence.xml)文件中描述映射或使用注释。您需要persistence.xml信息来创建实体管理器。 “unitName”是指persistence.xml文件中persistence-unit的“name”属性。