gpt4 book ai didi

java - EntityManager的@PersistenceContext注入(inject)

转载 作者:行者123 更新时间:2023-12-01 09:46:16 24 4
gpt4 key购买 nike

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

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 是什么?

最佳答案

and I understood that you either can describe your EM in persistence.xml or use annotations.

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

您可以通过 @PersistenceContext 将持久性上下文 (EntityManager) 注入(inject)到 EJB 中注解。

Should I create also 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 文件

What is for unitName?

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

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

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

关于java - EntityManager的@PersistenceContext注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37992459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com