没有persistence.xml的Spring 3.1提供“无法解析持久性单元根URL”

时间:2011-11-08 15:07:02

标签: hibernate spring jpa-2.0

我正在尝试使用JPA EntityManagerFactory bootstrapping without persistence.xml,这是Spring 3.1中的新功能(从M2开始),但看起来spring仍在搜索persistence.xml文件,尽管{{1}指定。

在context.xml中,实际配置了entityManagerFactory:

packagesToScan

但是在应用程序启动时,会出现<bean id="my-persistence-unit" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> </props> </property> <property name="packagesToScan"> <list> <value>my.package.name</value> </list> </property> </bean> 消息“无法解析持久性单元根URL”:

PersistenceException

在我添加... Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'my-persistence-unit' defined in class path resource [META-INF/context.xml]: ... Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:429) at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:327) at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:309) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:209) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1504) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1442) ... 34 more Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179) at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:426) ... 40 more 之前,我有一个最小packagesToScan,并设置persistence.xml,如下所示:

persistenceXmlLocation

工作得很好。那么我现在做错了什么呢?

修改已添加<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/> ,错误仍然存​​在。

编辑根据已删除的评论删除了persistenceUnitName;将bean重命名为持久性单元名称(对于jpaVendorAdapter

更新此错误似乎取决于使用哪种应用程序上下文加载器。该代码通过@PersistenceContext进行spring / junit测试,但不能通过@ContextConfiguration

进行

2 个答案:

答案 0 :(得分:10)

这是Spring的一个错误,我reported it

请注意,当所有类路径项都是jar时,它仅适用于打包的应用程序。这就是为什么它在单元测试中不会失败的原因。

答案 1 :(得分:0)

我认为这个类不允许你完全删除persistence.xml文件。来自它的javadoc:

“但是,这个FactoryBean更灵活,你可以覆盖persistence.xml文件的位置,指定要链接的JDBC数据源等”。

我认为它的作用是让你拥有一个最小的persistence.xml文件,然后让你通过监听器等进一步配置EMF。