2016-05-16 2 views
5

私はGenericDaoに基づいてWebサービスを作ろうとしています。私はPerson Entityを持っていて、GenericDaoによって出されたそのEntityのためにDAOを作ろうとしています。しかし@Transactional注釈でトランザクションを開くことができません:TransactionSynchronizationManager.isActualTransactionActive() = falseGenericDao:@トランザクションが動作しません..再度

私はどこでも見つからない@Transactionalです。私はどこにでも@Transactionalを追加しようとしました。注釈がGenericDaoから継承していないようですGenericDaoImpl.java

春-config.xmlの

 

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd"> 

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

     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://127.0.0.1:5432/test" /> 
     <property name="username" value="postgres" /> 
     <property name="password" value="postgress" /> 
     </bean> 

     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="annotatedClasses"> 
     <list> 
     <value>org.entity.nci.person.Person</value> 
     </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
      <prop 
      key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 

      </props> 
     </property> 
     <property name="packagesToScan" value="com.byteslounge.spring.tx.model" /> 
     </bean> 

     <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     p:sessionFactory-ref="sessionFactory"> 
     </bean> 
     <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> 
     <tx:attributes>  
     <tx:method name="*"/> 
     </tx:attributes> 
     </tx:advice> 

    </beans> 

GenericDao.java

package org.dao.nci.person; 

import java.io.Serializable; 
import java.util.List; 

import javax.jws.WebMethod; 
import javax.jws.WebService; 

import org.springframework.transaction.annotation.Transactional; 

public interface GenericDao<E,K> { 
    @WebMethod(exclude = true) 
    public String add(List<E> entities) ; 
    @WebMethod(exclude = true) 
    public String saveOrUpdate(E entity) ; 
    @WebMethod(exclude = true) 
    public String update(E entity, String whereClause) ; 
    @WebMethod(exclude = true) 
    public String remove(E entity); 
    @WebMethod(exclude = true) 
    public E find(K key); 
    @WebMethod(exclude = true) 
    public List<E> get(String whereClause) ; 
} 

..感じています

package org.dao.nci.person; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import javax.jws.WebService; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @SuppressWarnings("unchecked") @Repository public abstract class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> { @Autowired private SessionFactory sessionFactory; protected Class<? extends E> daoType; public GenericDaoImpl() { Type t = getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) t; daoType = (Class) pt.getActualTypeArguments()[0]; } protected Session currentSession() { return sessionFactory.getCurrentSession(); } @Override @Transactional public String add(List<E> entities) { for(Object entity : entities){ currentSession().save(entity); } return "test"; } @Override @Transactional public String saveOrUpdate(E entity) { currentSession().saveOrUpdate(entity); return "test"; } @Override @Transactional public String update(E entity, String whereClause) { currentSession().saveOrUpdate(entity); return "test"; } @Override @Transactional public String remove(E entity) { currentSession().delete(entity); return "test"; } @Override @Transactional public E find(K key) { Session session = currentSession(); Transaction transaction = session.beginTransaction(); transaction.commit(); //session.close(); return (E) session.get(daoType, key); } @Override @Transactional public List<E> get(String filter) { List<E> records = currentSession().createCriteria(daoType).list(); return records; } } 

PersonDao.java

package org.dao.nci.person; 

import java.util.List; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebResult; 
import javax.jws.WebService; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.entity.nci.person.Person; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

@WebService 
@XmlRootElement(name = "ComplexService") 
@Transactional 
public interface PersonDao extends GenericDao<Person, String>{ 



    @WebMethod(operationName = "selectPerson") 
    @WebResult(name="row") 
    @Override 
    @Transactional 
    public List<Person> get(@WebParam(name="filter") String whereClause); 
    @WebMethod(operationName = "insertPerson") 
    @Override 
    @Transactional 
    public String add(@WebParam(name="row") List<Person> persons); 

} 

Iは、両方のアドバイス試みたPersonDaoImpl.java

package org.dao.nci.person; 

import java.util.List; 

import javax.jws.WebParam; 
import javax.jws.WebService; 

import org.entity.nci.person.Person; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 



@WebService(endpointInterface = "example.catalog.ProductCatalogService", 
serviceName = "ProductCatalogService") 
@Repository 
@Transactional 
public class PersonDaoImpl extends GenericDaoImpl<Person, String> 
         implements PersonDao { 





    } 

UPDATE

オーバーライドメソッドをPersonDaoImpl.javaこのようなで:

package org.dao.nci.person; 

import java.util.List; 

import javax.jws.WebParam; 
import javax.jws.WebService; 

import org.entity.nci.person.Person; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.transaction.support.TransactionSynchronizationManager; 



@WebService(endpointInterface = "example.catalog.ProductCatalogService", 
serviceName = "ProductCatalogService") 
public class PersonDaoImpl extends GenericDaoImpl<Person, String> 
        implements PersonDao { 

@Override 
@Transactional 
public String add(List<Person> entities){ 
    return super.add(entities); 
} 




} 

と私は=「false」のプロキシ・ターゲット・クラスを設定しようとしました

両方..メソッドがエラーなしで完了助けにはならなかったが、コミットではありません。 TransactionSynchronizationManager.isActualTransactionActive()はまだFalseです。 Spring Docsから

+1

インターフェイスに注釈を付ける理由がわかりません。また、実際の実装や、私が見ることができるあなたのimplの注釈を付ける実際の方法はありません。 – Makoto

+0

私は何時間も試してみるだけですべてを注釈しようとしていました。その真のところでは、インタフェースで@Transactionalは必要ありません。実装については、PersonDaoImpl.javaを意味しますか?新しいメソッドを追加せずにGenericDaoImpl.javaから拡張したいだけです。私はTransactionalアノテーションでオーバーライドしようとしていたが、うまくいかなかった。 –

+0

PersonDaoImplはどのように構築されますか?私はあなたのアプリケーションのコンテキストでは表示されませんが、それはあなたが投稿された部分だけかもしれません。 – Pace

答えて

-1

春は 注釈インターフェースとは対照的に、あなただけの、具体的なクラス(とメソッド具象クラスの )@Transactional注釈で注釈を付けることをお勧めします。 @Transactional アノテーションをインターフェイス(またはインターフェイスメソッド)に配置することはできますが、インターフェイスベースの プロキシを使用している場合は、 と同じように動作します。 Javaアノテーションが インターフェイスから継承されないという事実は、クラスベースのプロキシー (proxy-target-class = "true")またはウィービングベースのアスペクト (mode = "aspectj")を使用している場合、トランザクションの設定は によって認識されず、オブジェクトはプロキシミングおよびウィービングインフラストラクチャと認識されず、オブジェクトは がトランザクションプロキシにラップされません。

私はクラスベースのプロキシがデフォルトだと思うので、あなたはそれを変更するか、問題を解決する新しい方法を考え出す必要があります。

+0

また、DAOは通常、(操作に近すぎる)トランザクションを配置するのに最適な場所ではないため、これが典型的な使用例かどうかはわかりません。 – Pace

+0

注釈はPersonDaoImpl.javaに配置する必要がありますか? –

+0

どちらか、またはプロキシモードをインターフェイスベースのプロキシに変更します。 – Pace

関連する問題