【问题标题】:Entity is not mapped exception when entity used in EJB module在 EJB 模块中使用实体时,实体未映射异常
【发布时间】:2013-10-08 15:19:44
【问题描述】:

我遇到了实体映射问题。

这是包含几个模块的 JBoss,其中一个包含带有注释的实体映射的包

@Entity 
@Table(name = "PG_ATTR_A")
public class PgAttrA
// declaration omitted
}

在单独的包和单独的 EJB 模块中,我有一个 DAO 来访问这些数据

@Stateless
@Clustered
public class PgAttrDao implements PgAttrDaoLocal, PgAttrDaoRemote {

    @PersistenceContext (unitName = "Persistence_Unit")
    EntityManager entityManager;

    public List<PgAttrA> find(...) {
        Query query = entityManager.createQuery("FROM PgAttrA WHERE ..skiped..");
        // set some parameters, skipped
        return query.getResultList();
    }
}

persistence.xml 的内容 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

<persistence-unit name="Persistence_Unit" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>DS</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>
        <property name="hibernate.cache.use_second_level_cache" value="false"/>          
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    </properties>
</persistence-unit>

问题是 DAO 似乎不知道 PgAttr 类中声明的 ORM。

我有这个特殊的例外:

目标虚拟机发生异常: org.hibernate.hql.ast.QuerySyntaxException:PgAttrA 未映射 [来自 PgAttrA WHERE ..skiped..] java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException:PgAttrA 未映射 [来自 PgAttrA ..跳过..]

我有一些其他的 DAO 在与实体本身相同的模块中访问这个特定的实体,它就像一个魅力。我只是无法访问该 DAO 的来源来添加一些新功能。

所以问题是为什么我的 DAO 看不到映射,我应该怎么做才能修复它?

【问题讨论】:

    标签: java hibernate jboss ejb persistence


    【解决方案1】:

    事实上,我只是错过了 persistence.xml 中的 jar 文件声明

    所以我添加了

    <jar-file>../jar_where_persistence_declared.jar</jar-file>
    

    紧接着

    <jta-data-source>DS</jta-data-source>
    

    问题已经解决了

    【讨论】:

      【解决方案2】:

      如果您使用 JPQL,请将您的查询更改为:

       Query query = entityManager.createQuery("SELECT p FROM PgAttrA p WHERE ..skiped..");
      

      来自here的JPQL查询示例

      如果你使用 HQL:

      Query query = entityManager.createQuery("FROM PgAttrA AS p WHERE ..skiped..");
      

      来自here的HQLQueries示例

      如果您的问题没有解决,请检查您的persistence.xml

      【讨论】:

      • @user1455836 为什么你使用&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; 你可以使用&lt;provider&gt;org.eclipse.persistence.jpa.PersistenceProvider&lt;/provider&gt; 更容易
      • 此声明在整个服务器中使用,所以我会更好地坚持使用它同时,感谢您检查persistence.xml的想法,我已经设法找到了答案。
      • @user1455836 我编辑了我的答案,您可以点赞或接受以帮助其他用户
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多