Spring3.1+Hibernate4.1.2+GlassFish3.1.2 : JTA : no transaction is in progress

虾米哥 阅读:15 2024-11-24 20:56:43 评论:0

我正在使用 Spring3.1、Hibernate(JPA) 4.1.2、GlassFish 3.1.2。

我已经成功通过 JPA 和 JNDI 数据源访问数据库, 但是当我尝试将数据插入数据库时​​,遇到了以下问题。

[#|2012-05-02T21:19:55.714+0900|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=20;_ThreadName=Thread-2;|StandardWrapperValve[appServlet]: PWC1406: Servlet.service() for servlet appServlet threw exception 
javax.persistence.TransactionRequiredException: no transaction is in progress 
        at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:976) 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
        at java.lang.reflect.Method.invoke(Method.java:597) 
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) 
        at $Proxy227.flush(Unknown Source) 

我的源代码如下。

持久性.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_2_0.xsd" 
        version="2.0"> 
        <persistence-unit name="persistenceUnit" transaction-type="JTA"> 
                <provider>org.hibernate.ejb.HibernatePersistence</provider> 
                <jta-data-source>jdbc/myDataSource</jta-data-source> 
                <properties> 
                        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
                        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" /> 
                        <property name="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory" /> 
                </properties> 
        </persistence-unit> 
</persistence> 

Spring 配置

<context:annotation-config/> 
 
<bean id="loadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
 
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" /> 
 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="persistenceUnit" /> 
    <property name="loadTimeWeaver" ref="loadTimeWeaver" /> 
    <property name="jpaVendorAdapter"> 
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean> 
    </property> 
</bean> 
 
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> 
<tx:annotation-driven transaction-manager="txManager"/> 
 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
        <tx:method name="*" /> 
    </tx:attributes> 
</tx:advice> 
 
<aop:config> 
    <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.z.*.*(..))" /> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" /> 
</aop:config> 

道接口(interface)

package x.y.z; 
 
import org.springframework.transaction.annotation.Transactional; 
 
public interface MyTableDao { 
 
    @Transactional 
    public void persist(MyTable myTable); 
 
} 

道实现

package x.y.z; 
 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.springframework.stereotype.Repository; 
 
@Repository 
public class MyTableDaoImpl implements MyTableDao { 
 
    @PersistenceContext 
    private EntityManager em; 
 
    public void persist(MyTable myTable) { 
        em.persist(myTable); 
        em.flush(); 
    } 
} 

请教我哪里不对!

请您参考如下方法:

将@Transactional 注释放在具体的持久化方法而不是接口(interface)上。


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号