有没有办法让Spring / JPA自动检测用@Entity注释的类?
这是我对entityManagerFactory
的配置<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
...这是我的persistence.xml ...
<persistence-unit name="foo">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate..." value="..."/>
<property ...
</properties>
</persistence-unit>
此配置正常运行。但是:当我将以下行添加到我的entityManagerFactory配置
时<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
JPA没有找到使用@Entity注释的类。所以,我得到像这样的例外:
java.lang.IllegalArgumentException: Unknown entity: foo.Bar
其中foo.Bar是一个用@ javax.persistence.Entity注释的类
我现在添加
<class>foo.Bar</class>
到我的persistence.xml,一切都很好。但是为什么我在使用persistenceXmlLocation时必须在persistence.xml中指定我的类,否则不是?
注意:您可能会问我为什么要使用persistenceXmlLocation:它会解决this problem。
答案 0 :(得分:2)
你没有确切地说到底是什么,所以也许我错了,但看起来你感觉陷入了我陷入的陷阱。 persistence.xml文件的位置定义了默认情况下Spring(或任何JPA提供程序)在哪里查找@Entity类。来自JPA spec,第8.2.1节
persistence.xml文件定义了持久性单元。 persistence.xml文件位于 持久性单元根的META-INF目录。它可用于指定托管持久性 包含在持久性单元中的类,这些类的对象/关系映射信息,以及 持久性单元以及持久性单元的实体管理器和实体管理器工厂的其他配置信息。该信息可以通过遏制或参考来定义, 如下所述。
对象/关系映射信息可以采用管理持久性上的注释的形式 包含在持久性单元中的类,包含在META-INF目录中的orm.xml文件 持久性单元的根,类路径上的一个或多个XML文件,并从persistence.xml文件中引用,或者这些文件的组合。 托管持久性类可以包含在持久性单元的根目录中;或者他们 可以通过引用来指定,即通过命名类,类存档或XML映射文件 (在应用程序类路径中可访问的(反过来引用类);或者可以通过这些方法的某种组合来指定它们。
因此虽然该字段被称为persistenceXmlLocation,但它可能应该被称为persistenceXmlName,因为其目的是能够创建具有非标准名称的persistence.xml文件,以便EE容器不会将其拾取。它仍然可以作为查找实体类的标记。
答案 1 :(得分:0)
(来自Y.Lev) 当spring-beans.xml中的entityManagerFactory bean带有location属性时,还带有&#39; classpath:&#39;指示: 在类路径中的哪个位置(在[bin]或[build]下的eclipse中)放置它并不重要。
1)在eclipse下:\ WebContent \ WEB-INF \ classes \ persistence.xml下的persistence.xml 2)在Tomcat下:\ WEB-INF \ classes \ persistence.xml下的persistence.xml 3)当没有在WEB项目中放置在[bin]或[build]下的任何地方时。
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
lazy-init="false" p:dataSource-ref="dataSource">
<property name="persistenceUnitName" value="empPU" />
<property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
</bean>
persistence.xml文件应该在classpath下的某处手动复制 .. \ BIN \ persistence.xml中 否则它会被忽略!!!
答案 2 :(得分:-1)
对于以下异常: 引发者:javax.persistence.PersistenceException:无法解析持久性单元根URL 在org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:452) 在org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:343) 在org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:325) 在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:224) 在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ......还有14个
在我的情况下,jar本身包含了META-INF / persistence.xml,Spring没有找到提示:
最后,我做了以下事情:
java -classpath&#34;。; my-jarThatIncludesTheMetaInfPersistence.jar&#34;主要论点......
诀窍是添加&#34;。&#34;到类路径。 然后spring在类路径中找到了xml文件。