【问题标题】:Hibernate 4 (Jboss as 7) can't auto detect entity and insert into PersistenceUnit, cause `unknown entity` exceptionHibernate 4(Jboss as 7)无法自动检测实体并插入 PersistenceUnit,导致“未知实体”异常
【发布时间】:2011-11-12 10:49:56
【问题描述】:

我遇到了与此 How to auto-register entities with JPA/Hibernate: Unknown entity 类似的问题。

我使用 jboss as 7,hibernate 4(与 jboss as 7 一起出现),spring 3.0.5。 我用@Entity 注释我的实体类。 并使用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 生成 entityManager。以下是bean定义:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:jboss/datasources/appsubmission" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="app_sub_jpa" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false" />
            </bean>
        </property>
</bean>

以下是persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
    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">

    <persistence-unit name="app_sub_jpa">
        <description>Hibernate for JPA</description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:jboss/datasources/myds</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        </properties>
    </persistence-unit>
</persistence>

一切都很顺利,直到我尝试访问数据库,例如:

entityManager.persist(myEntity);

它抛出一个异常,说“MyEntity”是未知实体。

Spring 3..0.5 + hierbnate 3.6.6.final + jboss as 7 Database access 中,Matt 告诉我在我的 persistence.xml 文件中添加元素,问题就解决了。 但问题是,在另一个项目中,我使用了类似的配置(相同的 persistence.xml 和类似的 bean 定义),一切顺利,没有抛出 unknown entity 异常。我记得,persistence.xml 文件中不需要&lt;class&gt;,因为 jboss/hibernate 会扫描带有@Entity 注释的类并将其添加到 PU 中。

我开启了TRACE级别的日志,在两个项目中jboss as 7好像创建了两个persistenceUnit,是一样的。

PersistenceUnitMetadata(version=2.0) [
    name: app_sub_jpa
    jtaDataSource: null
    nonJtaDataSource: java:jboss/datasources/myds
    transactionType: JTA
    provider: org.hibernate.ejb.HibernatePersistence
    classes[
    ]
    packages[
    ]
    mappingFiles[
    ]
    jarFiles[
    ]
    validation-mode: AUTO
    shared-cache-mode: UNSPECIFIED
    properties[
        hibernate.dialect: org.hibernate.dialect.MySQLDialect
    ]]

11:23:45,127 DEBUG [org.hibernate.ejb.Ejb3Configuration] (MSC service thread 1-3) Processing PersistenceUnitInfo [
    name: app_sub_jpa
    persistence provider classname: org.hibernate.ejb.HibernatePersistence
    classloader: ModuleClassLoader for Module "deployment.admin.war:main" from Service Module Loader
    Temporary classloader: org.jboss.as.jpa.classloader.TempClassLoader@28e13c84
    excludeUnlistedClasses: false
    JTA datasource: null
    Non JTA datasource: org.jboss.jca.adapters.jdbc.WrapperDataSource@5b4c1313
    Transaction type: JTA
    PU root URL: vfs:/D:/Server/jboss-as-7.0.0.Final/bin/content/admin.war/WEB-INF/classes/
    Shared Cache Mode: UNSPECIFIED
    Validation Mode: AUTO
    Jar files URLs []
    Managed classes names []
    Mapping files names []
    Properties [
        hibernate.dialect: org.hibernate.dialect.MySQLDialect]

【问题讨论】:

    标签: hibernate spring jpa jboss persistence-unit


    【解决方案1】:

    Hibernate 在{persistenceUnit.root}/META-INF/persistence.xml 中找到persistence.xml,因此它应该扫描{persistenceUnit.root} 以查找带注释的类。

    如果您的 persistence.xml 位于其他位置,您将需要手动添加 &lt;class&gt; 元素,或指定包含实体的 &lt;jar-file&gt;

    【讨论】:

    • 我将我的项目打包成一个war文件。并且persistence.xml 在WEB-INF/classes/META-INF/persistence.xml 中。是你说的那个地方吗?
    • hrm,这似乎应该可以工作。您确定已将 spring 配置为处理注释吗?我离开了我的项目,所以我现在无法参考它来获得确切的设置。
    • 在我的 applicationContext.xml 文件中,我有 &lt;context:component-scan base-package="com.mycompany.myproject"/&gt;&lt;context:annotation-config /&gt;。 spring 处理注解够不够?
    • 对不起,我的意思是休眠,而不是春天。他们在同一个根目录下,看起来你应该没问题。您可以将 jar 文件设置为指向您的类目录,如 docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/… 中所述
    • 嗯...谢谢你的建议,我会试一试的。我认为它应该可以解决问题并且不会抛出unknown entity 异常。但在我的另一个项目中,我使用与 7 服务器相同的 persistence.xml 和相同的 jboss。找不到我的一个项目无法自动检测到我的 PU 中的实体类的原因。
    【解决方案2】:

    我有同样的问题,你能尝试在你的 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 中使用这个属性

    <property name="packagesToScan" value="mypackage" />    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多