2012-05-03 18 views
3

私はSpring3.1、Hibernate(JPA)4.1.2、GlassFish 3.1.2を使用しています。Spring3.1 + Hibernate4.1.2 + GlassFish3.1.2:JTA:トランザクションは進行中ではありません。

JPAとJNDIデータソース を使用してDBにアクセスしましたが、データをDBに挿入しようとしたときに、以下の問題が発生しました。

[#|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) 

私のソースコードは以下の通りです。

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_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> 

スプリング設定

<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> 

ダオインタフェース

package x.y.z; 

import org.springframework.transaction.annotation.Transactional; 

public interface MyTableDao { 

    @Transactional 
    public void persist(MyTable myTable); 

} 

DAO実装

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(); 
    } 
} 

何が悪いのか教えてください!

+0

取引の宣伝に関係があるかどうか確認してください。 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#tx-propagation – Atul

答えて

0

@Transactionalアノテーションを、インターフェイスではなく具象メソッドに置きます。