2011-01-18 5 views
1

최대 절전 모드에서 다중 단계 거동에 관한 문제가 거의 없습니다. 이것이 내가하는 일이다. 내 DAO 방법최대 절전 모드에서의 다단계 트랜잭션

  1. 하나는 표 A에 새 레코드를 생성하고 오라클은 기본 키를 생성 검색합니다.

  2. 코드가 다음과 같은 형태의 1 단계

에서 취득한 기본 키 테이블 B에서 행을 업데이트 :

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
public Object myDAOMethos(...){ 
    .... 
    getHibernateTemplate().execute(
new HibernateCallback<Long>() { 
public Long doInHibernate(Session session) 
    throws HibernateException, SQLException { 
    // Create a new record in table A 
    session.save(objA); 

    final long pKey = objA.getId(); 

    // Update the row in table B 
    org.hibernate.Query query = session 
     .getNamedQuery("updateBQuery").setLong("idB",pKey... 
    query.executeUpdate(); 
    } 
    } 
    return true; 
} 
}); 
} 

방법은 transction 따라 결합된다.

내 문제 : 바람둥이에이 코드를 실행하면 모든 것이 잘 작동합니다. 그러나 이것에 대한 junit 테스트 케이스를 실행하려고하면 B 테이블의 업데이트가 수행되지 않습니다. 콘솔 출력 (hibernate.show_sql = true)에서 업데이트 SQL을 볼 수는 있지만. 예외도 없습니다! 단지 삽입이 일어나서 그게 다야.

여기 무슨 일인지 잘 모름! 어떤 아이디어!?

관련, -J

답변

0

몇 가지 이 잘못 될 수

  1. 당신이 수동으로 제 1 개체에 대한 외부 키를 업데이트되었는지 의심; 최대 절전 모드는 당신이 당신의 관계를 올바르게 설정한다면 당신을 위해 그렇게해야합니다.

  2. 테스트 클래스는 어떻게 설정됩니까? 테스트가 투명 해 지도록 어느 시점에서 데이터를 롤백합니까? 내가보고있는 것은 SQL을 보았지만 테스트에서 데이터를 보지 못했다면 잘못된 시간에 데이터에 액세스하려고 시도했기 때문입니다. 데이터가 커밋되지 않았거나, 또는 데이터가 이미 롤백되었습니다 (롤백중인 경우). 당신이 시험해보고 싶은 한 가지 방법은 tx를 끄고 테스트를 실행하는 것입니다. 데이터를 수동으로 정리해야하지만 테스트의 tx 구성이 문제인지 여부를 나타내야합니다.

봄 답장을 보내 주셔서 다시 당신을 위해 거래 및 압연 데이터를 관리 가능한 몇 가지 기본 테스트 클래스가 ....

+0

또한 포인트 1과 관련하여 일부 제약으로 인해 "외래 키"가 실제로 외래 키로 설정되지 않습니다. – joesatch

0

감사가 있습니다. 당신 말이 맞아요.

이 답변을 게시하는 동안 나는 문제가 있다는 것을 깨닫고 그것을 시도했습니다.

게시물에 2 점이 있습니다. 기본적으로 junit 테스트 케이스 자체는 "AbstractTransactionalJUnit4SpringContextTests"를 사용하고 @Rollback을 통해 테스트 후 DB 커밋/롤백을 관리합니다. 기본적으로 업데이트하려는 데이터는 처음부터 생성되지 않았습니다. 내가 콘솔에서 어떤 오류도 보지 못했음을 아직도 놀라워한다 !!

답을 올바른 것으로 받아들입니다. 엄청 고마워!

-J

관련 문제