Spring 弹簧&x27;s EntityManager没有坚持

Spring 弹簧&x27;s EntityManager没有坚持,spring,hibernate,jpa,spring-transactions,transactional,Spring,Hibernate,Jpa,Spring Transactions,Transactional,嗯,我的项目使用EJB和JPA(使用Hibernate),但我不得不切换到Spring。 在那之前一切都很顺利。EJB用于注入EntityManager、控制事务等 好吧,当我切换到Spring时,我遇到了很多问题,因为我是Spring的新手。但在一切都运行之后,我遇到了一个问题:数据永远不会保存在数据库中。我将我的Spring配置为控制事务,我在JSF中使用了Springbeans,它有Spring服务来完成这些艰巨的工作。此服务已注入EntityManager并使用@Transactiona

嗯,我的项目使用EJB和JPA(使用Hibernate),但我不得不切换到Spring。 在那之前一切都很顺利。EJB用于注入EntityManager、控制事务等

好吧,当我切换到Spring时,我遇到了很多问题,因为我是Spring的新手。但在一切都运行之后,我遇到了一个问题:数据永远不会保存在数据库中。我将我的Spring配置为控制事务,我在JSF中使用了Springbeans,它有Spring服务来完成这些艰巨的工作。此服务已注入EntityManager并使用@Transactional REQUIRED。此服务将EntityManager传递给调用EntityManager.persist(bean)的DAO

选择似乎工作正常,JTA事务似乎工作正常(我在日志中看到),但实体未保存

以下是日志:

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter: doFilterInternal() (linha 136): Opening JPA EntityManager in OpenEntityManagerInViewFilter

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory: doGetBean() (linha 245): Returning cached instance of singleton bean 'transactionManager'

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: getTransaction() (linha 365): Creating new transaction with name [br.org.cni.pronatec.controller.service.MontanteServiceImpl.adicionarValor]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 493): Opened new Session [org.hibernate.impl.SessionImpl@2b2fe2f0] for Hibernate transaction

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 504): Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@2b2fe2f0]

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 569): Exposing Hibernate transaction as JDBC transaction [com.sun.gjc.spi.jdbc40.ConnectionHolder40@3bcd4840]

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler: doJoinTransaction() (linha 383): Joined JTA transaction


INFO: Hibernate: 
    select
        hibernate_sequence.nextval 
    from
        dual

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: processCommit() (linha 752): Initiating transaction commit

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doCommit() (linha 652): Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@2b2fe2f0]

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doCleanupAfterCompletion() (linha 734): Closing Hibernate Session [org.hibernate.impl.SessionImpl@2b2fe2f0] after transaction

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.SessionFactoryUtils: closeSession() (linha 800): Closing Hibernate Session

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter: doFilterInternal() (linha 154): Closing JPA EntityManager in OpenEntityManagerInViewFilter

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.EntityManagerFactoryUtils: closeEntityManager() (linha 343): Closing JPA EntityManager
在日志中,我看到它提交事务,但没有看到插入查询(Hibernate正在打印任何查询)。我还看到Hibernate查找可以获取序列ID的下一个值。但是在那之后,它从来没有真正插入

以下是spring上下文配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="PronatecPU" />
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
<property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
<property name="jpaProperties">
    <props>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
    </props>
</property>
</bean>


<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
    <property name="transactionManagerName" value="java:/TransactionManager" />
<property name="userTransactionName" value="UserTransaction" />
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


<tx:annotation-driven transaction-manager="transactionManager" />
我的MontanteDao继承自一把基刀,如下所示:

public class MontanteDao extends BaseDao<Montante> {

    public MontanteDao(EntityManager entityManager) {
        super(entityManager);
    }

}
如您所见,它只需选择注入的entityManager并调用persist()方法。事务由Spring控制,就像打印在日志中一样,但插入查询从未打印在日志中,也从未保存

我很抱歉我的英语不好。 提前感谢您的帮助

编辑: 在调试过程中,我看到在每个entityManager.persist(T)之后,都有另一个操作在类型为“insert”的actionQueue中排队。毕竟,它只是将操作排队,而从不执行它们。有人已经遇到过这种问题吗?

尝试强制将a添加到数据库中

entityManager.flush();

我终于解决了我的问题。JTA有一些配置错误。我不知道会是什么,但我改成了RESOURCE_LOCAL,它成功了

第一次尝试RESOURCE_LOCAL时,Glassfish验证@PersistenceContext注释并抛出“无法解析与持久性上下文引用名称[…]对应的持久性单元”时,我遇到了麻烦。然后我找到了一个禁用此验证的好方法:指定

metadata-complete=true
在我的web.xml上。它说“不要看注释,因为它不是必需的”。嗯,Spring是我的容器,它将自己查看注释并配置所需的内容。那么我就不需要我的服务器来这么做了

毕竟,我的配置如下所示:

public class MontanteDao extends BaseDao<Montante> {

    public MontanteDao(EntityManager entityManager) {
        super(entityManager);
    }

}
web.xml:

<web-app version="3.0"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      metadata-complete="true">

我希望这将有助于解决同样的问题。

您确定transactionManager的配置吗。日志中的类名(HibernateTransactionManager)与SpringXML中的类名(JPATransactionManager)不匹配。我不知道是否可以,但我认为可以。日志的第二行显示了注入TransactionManager的Spring。将TransactionManager bean更改为使用JPATransactionManager或将TransactionManager bean替换为。我已经尝试过了。TransactionManager bean已经在使用JPATransactionManager。我也试过JtaTransactionManager。我不知道为什么,但它不会刷新数据库。我认为有一些错误的配置会说‘冲洗它!’。我已经试过了。然后我有一个例外,说没有可用的交易。这是由JTA完成的,就像我使用EJB3时一样。不过还是谢谢你。
metadata-complete=true
<web-app version="3.0"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      metadata-complete="true">
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="PronatecPU" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <tx:annotation-driven />
<persistence-unit name="PronatecPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>jdbc/pronatec</non-jta-data-source>
    <!-- ... -->
@PersistenceContext(type= PersistenceContextType.EXTENDED)
private EntityManager entityManager;