当前位置: 首页 > 知识库问答 >
问题:

注入的实体管理器不知道实体

杭涵映
2023-03-14

我有一个在Eclipse中定义的非常基本的JavaEE应用程序(一个EJB,一个带有PrimeFaces的网页,一个JPA实体)。它有四个项目,一个用于EAR,一个用于EJB,一个用于JPA,一个用于Web部件。问题是,我试图在JPA项目的persistence.xml中配置HiberNate作为持久化框架,但它并没有像我预期的那样完全工作。在我的EJB(@Statless)中,我可以通过两种方式检索实体管理器。我可以通过Persistence.createEntityManagerFactory()... entityManagerFactory.createEntityManager()来检索它,我可以通过@PeristenceContext(unitName = "") 注释来检索它。然而,只有使用前者,我的实体类(用@Entity注释)在我进行查询时才会被识别。

这段代码有效,我得到的(Hibernate)EntityManager知道“Country”实体:

final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("<unit-name>");
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Country> criteriaQuery = criteriaBuilder.createQuery(Country.class);
final Root<Country> root = criteriaQuery.from(Country.class);

但是在同一个类中使用注释是行不通的(抛出异常,请参见下文):

@PersistenceContext(unitName = "<unit-name>")
private EntityManager entityManager;
...
final CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
final CriteriaQuery<Country> criteriaQuery = criteriaBuilder.createQuery(Country.class);
final Root<Country> root = criteriaQuery.from(Country.class);

在最后一行引发了一个异常,即“国家”类不是“实体”。在检查注入的实体管理器时,我可以在会话和持久性上下文中看到国家,但是,它似乎不知道。这是引发的异常:

2014-10-06T16:06:29.634+0200|Severe: java.lang.IllegalArgumentException: Not an entity: class <package>.entity.Country
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.entity(MetamodelImpl.java:203)
at org.hibernate.jpa.criteria.QueryStructure.from(QueryStructure.java:139)
at org.hibernate.jpa.criteria.CriteriaQueryImpl.from(CriteriaQueryImpl.java:173)
at <package>.CountrySessionBean.getCountries(CountrySessionBean.java:35)
...

我已将Hibernate JAR作为“捆绑库”包含在EAR文件中,并尝试将它们添加到Glassfish的“lib”文件夹中。当Hibernate与上面的第一个实现一起工作时,我假设它使用正确的JAR进行了正确的配置。

我的persistence.xml看起来像这样(在META-INF下的JPA项目中,也是EAR的一部分):

<?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="<unit-name>" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <jta-data-source>MySQLResource</jta-data-source> <!-- DEFINED IN GLASSFISH -->

    <properties>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup" /> <!-- NEEDED? -->
        <property name="hibernate.transaction.jta.platform"
            value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />

        ...
    </properties>
</persistence-unit>
</persistence>

供参考:Hibernate v4。3.6,ejbv3。2,玻璃鱼v4。1,JPA v2。1.

有人能告诉我我错过了什么吗?是否需要一些额外的配置?我如何告诉应用程序国家实体在哪里?

我认为向实体添加@Entity会使其注册(当我调用Persistence.createEntityManagerFactory(...)时,它会这样做,但是,当通过JavaEE/Glassfish注入EntityManager或EntityManagerFactory时不会这样做。我还尝试过将类与...添加到persistence.xml中,但没有成功。当我检查注入的EntityManager时,我可以在其持久化上下文中找到国家类,因此它已与它注册,但我无法在查询中使用该类。

共有1个答案

饶承宣
2023-03-14

好的,看起来问题与我不知何故有两个实体类的实例有关。这解释了为什么我可以使用查询语言查询,但不能使用实体类本身。我已经追踪代码到元模型Impl,它在实体映射中查找,但因为它注册的类(正确地)与标准uery.from()中使用的类不同。我在部署JavaEE应用程序的文件夹中搜索了该类的多个实例,但我没有找到该类本身的多个实例。因此,它可能与类加载和/或应用程序包含多个子项目(jpa、web、ejb)的事实有关,每个子项目都引用实体类,或者可能是由于Eclipse在它如何部署或如何构建单独的部分...

在任何情况下,这个问题似乎都不是JPA、HiberNate、EJB等的问题。

 类似资料:
  • 我刚刚开始使用Spring ROO,并使用数据库逆向工程命令生成了我的实体类。然而每当我试图调用生成的实体类中的一个CRUD方法时,我总是得到这个异常:Java . lang . illegalstateexception:实体管理器没有被注入(Spring Aspects JAR是否被配置为AJC/AJDT方面库?) 我怀疑(通过查看生成的文件)EntityManager没有被注入到类中。你能告

  • 问题内容: 一个很长的问题,请忍受我。 我们将Spring + JPA用于Web应用程序。我的团队在讨论如何在注入的(基于泛型的东西对AppFuse中提供的线DAO,我们不使用过的注射某种原因)。我们正在使用“应用程序管理的持久性”。 反对注入a的论点是它太重了,因此不是必需的,这就是我们需要的。而且,由于Spring将为每个Web请求创建一个DAO的新实例(我对此表示怀疑),因此不会有任何并发​

  • 目前,我学习JavaEE JPA规范。我使用Hibernate作为JPA实现。我有下一个问题: 我有一个简单的实体 还有一个简单的服务: persistence.xml有下一个视图: 我不明白为什么Hibernate会话没有注入BookService。在作为EntityManager的图书服务中,我得到了org.jboss.as.TransactionScopedEntityManager而不是来

  • 我试图使用spring boot将EntityManager注释注入到我的DAO中,但是得到一个< code > InvalidDataAccessApiUsageException 消息,说没有可用的事务EntityManager。我的印象是,只要Spring Boot从< code>application.yml中获得了我的数据源信息,并且我用< code>@PersitenceContext

  • 编辑:堆栈跟踪如下: 下面是persistence.xml:

  • 我有一个EAR应用程序(要部署在WebLogic12c上),它有一个“持久化”组件。“persist”组件使用JPA(实现:EclipseLink)来持久化对象。 使用entityManager的bean声明为,实体管理器通过注释注入。 问题是,我每次尝试访问entityManager时都有一个(意思是他没有被正确注入)。 persistence.xml 我在常规代码中是这样使用的: MyBean