2011-04-12 5 views
3

내 저장소 '@PostConstruct에서 일부 데이터베이스 물건을 할 :@PostConstruct 및 "스레드에 바인드 된 하이버 네이트 세션 없음"예외

@Repository 
public class SomeRepositoryHibernate implements SomeRepository { 
    private SessionFactory sessionFactory; 

    @Autowired 
    public SomeRepositoryHibernate(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    ... 

    @PostConstruct 
    public void doSomestuffWithDb() { 
     ... 
    } 

} 

하지만 함께 실패합니다 :

org.hibernate.HibernateException: No Hibernate Session bound to thread, and 
    configuration does not allow creation of non-transactional one here 

거기에 어떤 쉬운 솔루션이 있습니까?

고마워!

+0

1)에서 JIRA에 자신의 솔루션을 제출 - 다른 컨테이너가 나는 @Autowired 표기법의 존재를 주어 믿고있어 봄 (다른 시간에 PostConstruct의 처리 때문에 중요한). 2) "doSomestuffWithDB"에서 실제로하고있는 일과 sessionFactory를 초기화하는 방법은 수명주기의 해당 시점에서 수행하는 작업에 영향을 미칩니다. – lscoughlin

+1

1) 저는 현재 부두에서 실행합니다 - 다른 사람들에게 테스트하지 않았습니다. 2) 난 그냥 세션을 최대 절전 모드로 얻을 수 없다 - sessionFactory.getCurrentSession(), 그래서 아무것도 할 수 있습니다. 감사합니다 –

+0

내 세션은 단지

답변

2
  • 당신은 당신이 (mode="aspectj" 제외)이 @Transactional를 사용할 수 없습니다 @PostConstruct
  • 에서 실행 트랜잭션이없는, 그래서 봄은
  • 트랜잭션 (transaction)가 최대 절전 모드에 필요한 트랜잭션을 시작할 수 없습니다 데이터를 변이

그래서, 당신이 (.openSession()를 통해) 세션 공장에서 세션을 생성하고 수동 트랜잭션을 시작해야합니다 (삽입/업데이트/삭제).

+0

bozho가 그것을 못 박았습니다. – lscoughlin

2

Spring과 함께 최대 절전 모드를 사용 중이며 Spring 구성 파일에서 sessionFactory와 트랜잭션 관리자를 올바르게 구성했다고 가정 할 때. 근본 원인은 doSomestuffWithDb() 메소드가 호출 될 때 봄까지 트랜잭션 준비 작업이 완료되지 않았다는 것입니다. @postconstruct는 bean이 생성 된 후에 만 ​​메소드가 호출되도록 보장 할 수 있습니다. 컨테이너가 모든 것을 준비 할 수 있도록 보장 할 수는 없습니다. 여기서는 트랜잭션 관련 내용을 의미합니다. 스프링 포럼에서 자세한 내용을 논의합니다. http://forum.springsource.org/showthread.php?58337-No-transaction-in-transactional-service-called-from-PostConstruct 또한, 저자는 컨테이너 무엇 https://jira.springsource.org/browse/SPR-5966?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs

관련 문제