有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有Spring的java EclipseLink无法持久保存到Db中

我正在使用Spring+EclipseLink 2管理Derby数据库上的实体。从db中选择对象工作得很好,但当我尝试持久化一个对象时,什么也没发生。程序正确执行,不会引发异常。我可能做错了什么,因为我不熟悉Spring,谢谢您的评论和建议:)

ServerDaoDb方法:

@Transactional
public void addServer(Server server) {
    EntityManager em = emf.createEntityManager();
    emf.createEntityManager().persist(server);
    em.close();
}

应用程序上下文是:

 ... 
 <tx:annotation-driven />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="SpringPratiquePU" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean 
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

坚持。xml:

  <persistence-unit name="SpringPratiquePU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>net.athom.spring.examples.models.eas.Server</class>
    <class>net.athom.spring.examples.models.eas.Node</class>
    <properties>
      <property name="eclipselink.target-database" value="DERBY"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/SpringPratique"/>
      <property name="javax.persistence.jdbc.password" value="clem"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="clem"/>
    </properties>
  </persistence-unit>
</persistence>

调试跟踪:

DEBUG JpaTransactionManager:365 - Creating new transaction with name [net.athom.spring.examples.service.impl.ServerManagerImpl.addServer]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
[EL Info]: 2010-10-29 15:33:27.443--ServerSession(14894886)--EclipseLink, version: Eclipse Persistence Services - 2.0.2.v20100323-r6872
[EL Info]: 2010-10-29 15:33:28.606--ServerSession(14894886)--file:/C:/netbeanProject/SpringPratique/src/_SpringPratiquePU login successful
15:33:28,893       DEBUG JpaTransactionManager:323 - Opened new EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@1779885] for JPA transaction
15:33:28,951       DEBUG DefaultListableBeanFactory:242 - Returning cached instance of singleton bean 'transactionManager'
15:33:28,952       DEBUG JpaTransactionManager:286 - Found thread-bound EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@1779885] for JPA transaction
15:33:28,953       DEBUG JpaTransactionManager:470 - Participating in existing transaction
15:33:29,266       DEBUG JpaTransactionManager:752 - Initiating transaction commit
15:33:29,267       DEBUG JpaTransactionManager:462 - Committing JPA transaction on EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@1779885]
15:33:29,268       DEBUG JpaTransactionManager:548 - Closing JPA EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@1779885] after transaction
15:33:29,308       DEBUG EntityManagerFactoryUtils:328 - Closing JPA EntityManager

共 (3) 个答案

  1. # 1 楼答案

    谢谢你的回答,两个都很有帮助。我最终使用了LocalContainerEntityManagerFactoryBean,这样就可以将实体管理器注入到我的dao中。 我添加了servlet-agent-2.5.6。lib文件夹上的jar和pass VM选项: -javaagent:path/to/lib/ervlet-agent-2.5.6。罐子

    然后我修改了ApplicationContext。xml:

     <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="SpringPratiquePU" />
             <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
        </bean>
    

    还有我的刀: ...

      @PersistenceContext
      private EntityManager em;
    
    
       @Transactional
       public void addServer(Server server) {
           em.persist(server);
       }
    

    坚持和交易现在很有魅力

  2. # 2 楼答案

    你的错误在这里:

    @Transactional
    public void addServer(Server server) {
        EntityManager em = emf.createEntityManager();
        emf.createEntityManager().persist(server);
        em.close();
    }
    

    您正在创建两个不同的EntityManager实例,一个是正在关闭的em,另一个是位于下一行的emf.createEntityManager()的新实例,您直接使用它来保存更改

    试试这个:

    @Transactional
    public void addServer(Server server) {
        EntityManager em = emf.createEntityManager();
        em.persist(server);
        em.close();
    }
    

    我猜,当您关闭em实例时,您的更改会写入DB,但如果没有写入,您必须在关闭em实例之前添加em.flush();

  3. # 3 楼答案

    我不确定您的配置到底出了什么问题(我猜手动创建的EntityManager不能参与@Transactional事务),但Spring中典型的JPA配置是这样的,所以您不需要手动创建EntityManager(还要注意工厂bean的类名):

    @PersistenceContext
    private EntityManager em;
    
    @Transactional  
    public void addServer(Server server) {  
        em.persist(server);  
    } 
    

    <bean id="entityManagerFactory"   
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">   
        <property name="persistenceUnitName" value="SpringPratiquePU" />   
    </bean>