Hibernate 4 (Jboss as 7) не может автоматически определять сущность и вставлять ее в PersistenceUnit, вызывая исключение "неизвестная сущность"
Я сталкиваюсь с подобной проблемой с этим Как автоматически регистрировать сущности с JPA/Hibernate: Неизвестная сущность.
Я использую 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" является неизвестной сущностью.
Весной 3..0.5 + hierbnate 3.6.6.final + jboss как 7 Доступ к базе данных, Мэтт сказал мне добавить элемент в мой файл persistence.xml, и проблема решена. Но проблема в том, что в другом проекте я использую похожий конфиг (тот же файл persistence.xml и аналогичное определение компонента), и все идет хорошо, нет unknown entity
исключение брошено. И, как я помню, <class>
не требуется в файле persistence.xml, так как jboss/hibernate будет сканировать класс с @Entity
аннотации и добавить его в ПУ.
Я включаю журнал уровня TRACE, и в двух проектах jboss как 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]
2 ответа
Hibernate находит файл persistence.xml в {persistenceUnit.root}/META-INF/persistence.xml
, поэтому он должен сканировать {persistenceUnit.root} для аннотированных классов.
Если ваш файл persistence.xml находится в другом месте, вам необходимо добавить <class>
элементы вручную, или укажите <jar-file>
который содержит сущности.
У меня та же проблема с этим, не могли бы вы попробовать использовать это свойство в вашем org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
<property name="packagesToScan" value="mypackage" />