Hibernate 4 (Jboss as 7) не может автоматически определять сущность и вставлять ее в PersistenceUnit, вызывая исключение «неизвестная сущность» - PullRequest
4 голосов
/ 07 сентября 2011

Я сталкиваюсь с подобной проблемой с этим Как автоматически регистрировать объекты с помощью JPA / Hibernate: Unknown entity .

Я использую jboss как 7, hibernate 4 (который поставляется вместе с jboss как 7), весна 3.0.5.Я аннотирую свой класс сущности с помощью @Entity.И используя org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean для генерации entityManager.и ниже определение бина:

<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 как 7 Доступ к базе данных Мэтт сказал мне добавить элемент в мой файл persistence.xml, и проблема решена. Но проблема в том, что в другом проекте я использую похожий конфиг (тот же файл persistence.xml и аналогичное определение компонента), и все идет хорошо, исключение unknown entity не выдается.И, насколько я помню, <class> не требуется в файле persistence.xml, так как jboss / hibernate отсканирует класс с аннотацией @Entity и добавит его в PU.

Я включаю уровень TRACElog, а в двух проектах jboss как 7 создает два одинаковых постоянства.

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]

Ответы [ 2 ]

1 голос
/ 10 мая 2013

У меня такая же проблема, не могли бы вы попробовать использовать это свойство в вашем org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean

<property name="packagesToScan" value="mypackage" />    
1 голос
/ 08 сентября 2011

Hibernate находит файл persistence.xml в {persistenceUnit.root}/META-INF/persistence.xml, поэтому он должен сканировать {persistenceUnit.root} на наличие аннотированных классов.

Если ваш файл persistence.xml находится где-то еще, вам нужно добавить <class>элементы или укажите <jar-file>, который содержит сущности.

...