persistence.xml - spring JPA

7

我已经阅读了很多文章,但是我无法找出错误所在……应该非常简单。我正在尝试使用Spring和JPA在appengine上编写应用程序。

我正在使用JEE5项目(不知道是否重要)。

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="persistenceXmlLocation">
        <value>classpath*:/META-INF/persistence.xml</value>
    </property>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="transactions-optional" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

持久化配置文件位于META-INF目录中(ROOT/META-INF/persistence.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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_1_0.xsd" version="1.0">

    <persistence-unit name="transactions-optional">
        <provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
        </properties>
    </persistence-unit>

</persistence>

我仍然遇到了这个异常(我试图移动src目录中的meta-inf目录,但没有成功,异常是相同的)。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericJpaDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected javax.persistence.EntityManagerFactory cz.cvut.fel.pupilbook.dao.support.jpa.GenericJpaDAO.entityManagerfactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/context/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named transactions-optional
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844)

感谢您的帮助。

你的编译输出中是否包含 META-INF/persistence.xml(即编译后的类所在位置)?如果没有,你尝试手动将 META-INF/persistence.xml 放置在那里并查看问题是否仍然存在了吗? - Denys Kniazhev-Support Ukraine
是的,它在target/name_of_the_project/META-INF文件夹中,在我构建它时,也在project.war/META-INF中。 - malejpavouk
1
实际上,我指的是你的类所在的位置,也就是你的文件夹cz/cvut/fel/pupilbook/.../OneOfYourClasses.class所在的位置。因此,META-INF应该与编译后的类所在的cz文件夹旁边。如果这样做不起作用,那么我和你一样困惑... - Denys Kniazhev-Support Ukraine
1个回答

2
答案分为两部分。
  1. denisk关于persistence.xml位置的正确,它应该在src下。
  2. 我缺少datanucleus的一些依赖项(我以为它们是提供的)。添加它们后,我得到了大量相关的异常。解决它们后一切正常。
因此,这是两个问题的巧合,每个问题掩盖了另一个问题的一部分。

你能否请发完整的解决方案?我的意思是,你在那之后做了什么改变以使它正常工作。 - Mayur Raiyani
抱歉,这个回答已经超过2年了,我没有可用的资源 :-( - malejpavouk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接