4

我的问题:

有没有办法告诉 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:它会解决这个问题

4

3 回答 3

2

你没有说具体在哪里,所以也许我错了,但看起来你觉得我掉进了陷阱。persistence.xml 文件的位置定义了默认情况下 Spring(或任何 JPA 提供程序)将在何处查找 @Entity 类。来自JPA 规范,第 8.2.1 节

persistence.xml 文件定义了一个持久性单元。persistence.xml 文件位于持久单元根目录的 META-INF 目录中。它可用于指定包含在持久性单元中的托管持久性类、这些类的对象/关系映射信息,以及持久性单元和实体管理器以及持久性单元的实体管理器工厂的其他配置信息。该信息可以通过包含或引用来定义,如下所述。

对象/关系映射信息的形式可以是对包含在持久化单元中的被管理的持久化类的注解、包含在持久化单元根目录的 META-INF 目录中的 orm.xml 文件、在持久化单元上的一个或多个 XML 文件。类路径并从persistence.xml 文件中引用,或这些文件的组合。 托管持久性类可以包含在持久性单元的根中;或者它们可以通过引用来指定——即,通过命名类、类档案或 XML 映射文件(反过来引用类),这些文件在应用程序类路径上是可访问的;或者它们可以通过这些方式的某种组合来指定。

所以虽然该字段被称为persistenceXmlLocation,但它可能应该被称为persistenceXmlName,因为目的是能够创建一个非标准名称的persistence.xml 文件,这样EE 容器就不会拾取它。它仍然作为在哪里寻找实体类的标记。

于 2012-03-29T00:52:41.923 回答
0

(来自 Y.Lev)当 spring-beans.xml 中的 entityManagerFactory bean 带有 location 属性以及'classpath:'指令时:类路径中的位置无关紧要(当在 eclipse 中放在 [bin] 或 [建立]) 把它。

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 文件应该在类路径下的某个地方手动复制 ..\bin\persistence.xml 否则它会被忽略!

于 2014-08-16T18:12:56.193 回答
-1

对于以下异常:原因:javax.persistence.PersistenceException:无法解析 org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:452) 处的持久性单元根 URL .persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:343) at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:325) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java :224) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean。afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ... 14 更多

在我的例子中,jar 本身包含了 META-INF/persistence.xml,Spring 没有找到提示:

最后,我做了以下事情:

java -classpath ".;my-jarThatIncludesTheMetaInfPersistence.jar" 主要参数...

诀窍是添加“。” 到类路径。然后spring在classpath中找到了xml文件。

于 2015-02-25T15:04:10.347 回答