2014-04-01 2 views
0

아래의 두 클래스와 AOP 설정을 살펴보면, 이것이 맞는지 확실하지 않습니다. PartnerService에서 pointcut을 구성했지만 PartnerDao에서만 세션을 사용합니다. 이것이 PartnerDao에서 사용할 수있는 새로운 세션 (및 거래)을 안전하게 시작합니까?Spring & AOP : 포인트 컷 설정 권한을 얻으려면

이 내 클래스는

PartnerService.java :

public class PartnerService { 

    private PartnerDao dao; 

    public void setDao(PartnerDao dao) { 
     this.dao = dao; 
    }  

    PartnerDao getDao() { 
     return dao; 
    } 

    public List<Partner> getPartners() { 
     return getDao().getPartners(); 
    } 

    public void createPartner(Partner partner) { 
     getDao().createPartner(partner); 
    } 

} 

PartnerDao.java

public class PartnerDao { 

    private HibernateTemplate template; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.template = new HibernateTemplate(sessionFactory); 
    }  

    HibernateTemplate getTemplate() { 
     return template; 
    } 

    public List<Partner> getPartners() { 
     return getTemplate().execute(new HibernateCallback<List<Partner>>() { 

      @Override 
      public List<Partner> doInHibernate(Session s) throws HibernateException { 
       Criteria c = s.createCriteria(Partner.class); 
       return c.list(); 
      }      
     });   
    } 

    public void createPartner(Partner partner) { 
     getTemplate().save(partner); 
    } 

}

지금, 나는 사용하고 싶습니다 AOP 트랜잭션을 관리합니다. 나는 applicationContext.xml에서 다음과 같은 AOP 구성을 가지고 :

<aop:config>   
    <aop:pointcut id="serviceMethods" expression="within(com.company.pas.service.*)"/> 
    <aop:advisor advice-ref="companyTransactionAdvise" pointcut-ref="serviceMethods"/> 
</aop:config> 

내 AOP 구성을 보면

, 나는 (com.company.pas.service에 위치)에 PartnerService의 포인트 컷을 구성하고있어 . 그러나 저는 PartnerDao의 세션 만 다루고 있습니다. 이 클래스를 인스턴스화하는 방법은 PartnerDao의 자동 인스턴스로 PartnerService를 반환하는 ServiceFactory가 있다는 것입니다.

답변

0

Spring AOP Transactional Management을 사용하지 않는 이유는 무엇입니까? 주석을 사용하면 @Transactional으로 서비스 메소드에 주석을다는 것만 큼 쉽습니다.

+0

내가 이미 사용하고있는 것이 아닌가요? 나는 구성된 트랜잭션을 제어하는 ​​AOP 구성을 가지고있다. 구성과 클래스를 분리하지 않고 XML 구성을 사용하고 있습니다. – sbrattla

+0

오케이, 분명히 'tx'네임 스페이스를 통해 AOP 설정을 tx : advice로 사용하여 트랜잭션 관리자를 통과하는 것은 확실하지 않았습니다. 그렇다면 문제는 무엇입니까? 서비스의 진입 점인 DAO 메소드를 호출하는 한, 동일한 트랜잭션이 시작된 이후부터는 좋은 상태입니다. 일반적으로 삽입 된 DAO를 내부적으로 사용하는 서비스 계층에 트랜잭션 지원을 추가하는 것이 일반적입니다. – dimitrisli

+0

내가 얻지 못하는 것은 AOP가 서비스 클래스에 들어갈 때 트랜잭션을 시작하면 트랜잭션 관리자는 관련 DAO를 통해 사용 가능한 세션 (HibernateTemplate)이 서비스 클래스를 벗어날 때 커밋해야한다는 것을 어떻게 알 수 있는가? ? 또한, 내 서비스 클래스가 각각의 세션 (HibernateTemplate)을 가진 두 개의 다른 DAO를 사용한다면 AOP는이 두 세션이 관련되어 있고 원자 적이어야 함을 어떻게 알 수 있습니까? 이것은 내 서비스 클래스에서 "코드화 된"트랜잭션 경계 설정을 사용하여 달성하기가 매우 쉽습니다 ... 그러나 AOP가이 모든 것을 어떻게 알아낼 수는 없습니까? – sbrattla

관련 문제