2011-12-20 4 views
1

우리는 or-mapping 도구로 MyBatis (3.0.5)를 사용하고 있습니다.롤백 ORMapper 쿼리

나는 우리의 [responses] 데이터베이스 테이블 (우리는 PostgreSQL 사용)에 매핑 된 Response 개체를 MyBatis를 통해 만들었습니다. 다음과 같이

사실, 우리가 사용하는 ormapping 구조는 다음과 같습니다

  • ResponseMapper.xml -이 인 PSQL 쿼리가 ResponseMapper.java ** 클래스와 그 정의와 매핑 된 XML 파일 방법
  • ReponseMapper.java - 사용되는 인터페이스 - (위) XML 파일에 정의 된 질의
  • ResponseDAO.java MyBatis로 실행에 의해 사용되는 인터페이스 DI 용도 (스프링 사용)
  • ResponseDAOImpl.java - 실제로 ResponseMapper 메서드를 호출하는 ResponseDAO의 구체적인 구현입니다. 이 작품을 설정

    @Autowired 
    private ResponseDAO response; 
    
    public void doStuff() 
    { 
        int action = getAction(); 
    
        response.setAction(action); 
    
        response.insert(); 
    } 
    

    : 우리는 PostgreSQL을에 새 [responses] 레코드를 삽입하기 위해,

그래서 우리의 응용 프로그램에이 클래스의 인스턴스를 주입하기 위해 스프링을 사용하여, 코드는 호출 구성 요소에서 다음과 같습니다 아름답게 우리를 위해. 그러나 지금은 ResponseDAOImpl 클래스에 대한 JUnit 테스트 세트를 작성하려고합니다. PostgreSQL 데이터베이스에 대한 쿼리를 올바르게 실행하고 있는지 확인하고 싶습니다.

내가 알 수있는 한, 전체 데이터베이스를 "조롱하는"방법은 없습니다. 그래서 필자가 선택한 유일한 방법은 테스트 메소드가 쿼리를 실행하고 성공 여부를 확인한 다음 관계없이 롤백하는 것입니다.

MyBatis는 이러한 종류의 롤백 기능을 지원하지 않습니다. 나는 Old Nabble의 mybatis-user 메일 링리스트에서 this을 게시했지만 포스터는 Guice를 사용했으며 Guice를 통해 트랜잭션을 롤백하는 방법에 관한 것 같았습니다. MyBatis로 하지 지원 트랜잭션/롤백 (가 무엇입니까?!?!) 않으면 PostgreSQL의 - JDBC 드라이버가이를 지원하는 경우 내 유일한 repireve이 될 것 같은

, 그것은 보인다. 그런 다음 테스트 방법을 구성하여 ResponseDAO.insert() 메서드를 실행 한 다음 수동으로 드라이버 (MyBatis)를 통해 직접 트랜잭션을 롤백하려고 시도 할 수 있다고 생각합니다.

이 분야에 대한 경험이 있습니까? 코드 샘플? 팁? 모범 사례? 미리 감사드립니다!

답변

0

MyBatis는 "SqlSession"으로 작업 할 때 롤백을 허용합니다. 스프링 종속성 삽입 부품을 사용하면 메서드가 완료 될 때 트랜잭션이 자동으로 커밋됩니다.

당신은

  1. 이 의존성의 모의을 주사 그 중 몇 가지 옵션이 있습니다. 이 문제를 해결할 수있는 도서관이 있습니다. Mockito처럼 here is a good question on Spring Mockito stuff입니다. 이것은 자바에서 비즈니스 논리를 테스트하지만 실제 쿼리는 테스트하지 않습니다.

  2. 테스트를 실행 한 후 쿼리를 커밋하고 데이터를 삭제하십시오. 이것은 데이터베이스를 테스트하기 때문에 우리가 취한 접근법입니다. 당신은 분명히 당신의 데이터베이스의 테스트 인스턴스를 필요로 할 것이다.

  3. MyBatis Spring Integration에서 자동 커밋을 수행하는 클래스에 대한 자체 테스트 바인딩을 제공하고 테스트 환경에서 커밋 대신 쿼리를 롤백하도록 동작을 재정의 할 수 있습니다. 유사한 접근법이 Guice 통합에서 사용되었고, here으로 설명되어 있습니다.

+0

Andy, Remis B의 대답과 후속 의견을 참조 할 수 있습니까? 그 해결책이 효과가 없을까요? 내 테스트 메소드가 SqlSessionFactoryBean에서 처음 SqlSession을 가져오고 setAutoCommit (false), Savepoint를 획득하고 쿼리를 실행 한 다음 Savepoint로 롤백하면 어떻게 될까요? Spring이 여전히이 동작을 무시합니까? – IAmYourFaja

+0

매퍼를 주입하고 있습니까? 그렇다면 스프링이 매퍼 호출을 위해 새로운 SqlSession을 열 것이라고 생각합니다. 저는 Guice에 대해 더 잘 알고 있습니다. 그러나 docs [1]은 매퍼가 자신의 SQL 세션을 실행한다고 생각합니다. http://code.google.com/p/mybatis/downloads/detail?name=mybatis-spring-1.0.2-reference.pdf – Andy

0

이것이 필요한 것은 아닌데, org.apache.ibatis.session.SqlSession 클래스에는 롤백에 사용할 수있는 rollback() 메소드가 있습니다.

또 다른 접근법은 동일한 클래스에서 getConnection() 메소드를 사용하여 commit() 및 rollback() 메소드가있는 javax.sql.Connection javax.sql.Connection 클래스를 리턴하는 것입니다.

희망이 있습니다. Remis B

+0

당신도 알다시피, 나는 그것에 대해서 생각조차하지 않았습니다. 내 응용 프로그램 컨텍스트 (Spring에서 제공)를 통해 SqlSessionFactory에 액세스 할 수 있습니다. 거기에서 당신이 지적한 것처럼 SqlSession과 Connection을 얻을 수 있습니다. Savepoints, commit() 및 rollback()에 대한 액세스를 제공합니다. Remis 감사합니다! – IAmYourFaja

+0

여러분 환영합니다. 그게 효과가있다. –