2012-03-26 4 views
1

나는 Hibernate를 사용하는 웹 애플리케이션을 가지고 있는데, 일부 데이터를 유지하려고 시도하고 있지만 @Transactional 어노테이션을 사용 함에도 불구하고 트랜잭션 내에서 지속되지 않는다. 다음과 같이Hibernate @Transactional 트랜잭션을 시작하지 않는다.

내 서비스 클래스는 다음과 같습니다

@Service("profileService") 
public class ProfileService { 
    private EntityManager entityManager; 

    @Autowired 
    private AccountService accountService; 

    @Autowired 
    private ProfileDAOImpl profileDao; 

    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this.entityManager = em; 
    } 

    @Transactional 
    public void addConnectionToAccount(SocialConnection sc) { 
     entityManager.persist(sc); 
    } 

} 

addConnectionToAccount() 메소드가 정상적인 방법의 또 다른 스프링 빈에서 호출되고, 그리고 ProfileService 클래스는 현재이 주입되고 :

public class HibernateConnectionRepository implements ConnectionRepository { 

    @Inject 
    private ProfileService profileService; 

    @Override 
    @Transactional 
    public void addConnection(SocialConnection sc) { 
     try { 
      profileService.addConnectionToAccount(accountId, sc); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

@Transactional 주석을 호출하는 메서드에 넣으려고했는데 아무런 차이가 없으 리라는 희망이있었습니다.

이전에 나는 지속되는 개체가 테이블 제한 (null이 아닌 열과 같은)을 만족시키지 못하거나 메서드가 동일한 클래스 내에서 호출되고 호출하는 메서드가 거래가 아니지만 그 중 어느 것도 여기에 해당하지 않습니다 ..

아이디어가 있으십니까? 다음과 같이 그냥 자동으로 실패, 로그는 다음과 같습니다

2012-03-26 22:25:04,702 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2012-03-26 22:25:04,710 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - select SEQ_COUNT from SEQUENCE where SEQ_NAME = 'PO_SEQ' for update 
2012-03-26 22:25:04,711 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - update SEQUENCE set SEQ_COUNT = ? where SEQ_COUNT = ? and SEQ_NAME = 'PO_SEQ' 
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 2200, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator 

UPDATE

는 또한 HibernateConnectionRepository 콩이 주석되지 않는다는 것을 언급하고 싶어하고 실제로 @Configuration 클래스로 구성되고있다 (차이가있는 경우 @Configuration 클래스를 많이 사용하지 않음).

@Bean 
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
public ConnectionRepository connectionRepository() { 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if (authentication == null) { 
     throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
    } 
    ApplicationUser user = (ApplicationUser) authentication.getPrincipal(); 
    return usersConnectionRepository().createConnectionRepository(String.valueOf(user.getAccountId())); 
} 

빈이 로그인 한 사용자로 범위이지만, 또한 각 사용자에 대해 여러 번 생성 될 수있다 .. 또

답변

0

오류가 제대로 발생하지 않는 경우 문제가 발생했습니다.

이 문제와 관련된 : Let eclipse use maven to compile/weave my code은 새 버전의 Eclipse 및 M2E를 사용하여 발생합니다.

이클립스 클리닝이 애스펙트를 만들어 내지 못했기 때문에 트랜잭션 주석이 짠 것이 아니 었습니다. obviosuly 간헐적으로 일했기 때문에 정상적인 메이븐 깨끗한 설치 (명령 줄 등) 다음 직조가 완료됩니다 (이클립스 깨끗한 누른 un-did 직조, 그래서 만약 내가 maven 청소를 설치 한 다음 다시 일식 다시 빌드 않았다 작동하지).

Eclipse의 프로젝트에 AspectJ 빌더를 추가하여이 문제를 해결했다. 이제 클린/빌드를 실행하면 자동으로 빌드된다.

1

몇 가지 다음과 같이

빈을 생성하는 방법은 (당신이 좋은 제약과 함께 시작과 같은 콩에서 전화가 있지만)에서 볼 수 있습니다 : XML 파일에 <tx:annotation-driven /> 존재가

  • 입니다
  • 트랜잭션이 시작되지 않았습니까? TransactionSynchronizationManager.isActualTransactionActive()으로 확인하십시오. 다른 것일 수 있습니다 (거래 관련 문제가 아님)
+0

예, 주석 주도형 구성 (프록시가 아닌 모드로 aspectJ 사용). 이전에 entityManager.flush()를 추가하려했습니다. 지속 호출 후 "트랜잭션 진행 중"오류가 발생했지만 제안 된 코드로 확인합니다. 감사합니다 - 어떻게 작동하는지 알려드립니다 – rhinds

+0

좋습니다. 트랜잭션 동기화 관리자를 사용하여 확인했습니다. 확실히 트랜잭션이 없습니다. 그러나, 그것은 낯선 사람을 얻는다. 나는 entityManager.flush()를 추가하여 일찍 테스트했다. (트랜잭션 에러가 없다.) 플러시 콜을 제거하고 프로젝트를 정리했다./Eclipse에서 Eclipse를 다시 시작했다. 응용 프로그램에서 데이터를 커밋 할 관리 (DB를 증명할 수있는 행이 있음) -하지만 더 이상 기능을 다시 만들려면 시도가 실패하고 다른 것을 유지할 수 없습니다 (re-cleaning/restarting 재 시도 등). 트랜잭션이 때때로 시작되지만 항상 그런 것은 아니겠습니까? – rhinds

+0

내가 할 수없는 전체 프로젝트를 살펴볼 때까지는 그렇지 않습니다. 하지만 aspectJ에 대해 언급했는데 대신 프록시 모드를 사용해보십시오. – Bozho

관련 문제