2016-07-20 6 views
1

SQL 뷰에 매핑 된 엔티티가 있습니다. 또한 spring data jpa 저장소를 구성했습니다. 응용 프로그램을 실행하면 모든 것이 정상적으로 작동합니다. 그러나 문제는 메모리 내 H2 데이터베이스를 사용하는 테스트를 실행하려고 할 때 시작됩니다. 이 이유는 H2가 시작될 때 뷰가 존재하지 않는다는 것, 그리고 아마도 독립적 인 엔티티로 취급되어 스프링 부트가 독립적 인 메모리 테이블로 구성된다는 것입니다. 내가 테스트 리소스 폴더에 schema.sql 파일에 뷰 정의를 퍼팅 시도H2에서 뷰를 초기화하는 방법

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build(); 
} 

- - 아래와 같은

H2 데이터베이스에 대한 구성은 그러나

CREATE VIEW 
    my_view 
AS 
    SELECT 
     column_1, 
     column_2 
    FROM 
     m 
    INNER JOIN 
     mu 
    ON 
     m.id = mu.m_id 
    INNER JOIN 
     u 
    ON 
     mu.id = u.mu_id 

, 그것은 도움이되지 않습니다 어느 한 쪽. 그래서 때마다 나는 내 테스트에서 구성된 JPA 저장소를 호출 -이 같은

public interface MyViewRepository extends JpaRepository<MyView, Long> {} 

을 -

myViewRepository.findAll() 

그것이 내가 내 테스트에서 모든 m, muu 엔티티를 생성에도 불구하고, 빈 목록을 반환 이 검색 전에 관련 리포지토리를 사용합니다.

H2가 내보기 정의를 선택하도록 어떻게 구성 할 수 있습니까?

답변

1

이미 생성 된 데이터베이스에 연결하는 통합 또는 프로덕션 환경에 다른 DataSource를 선언하고 예상 된 뷰가 선언되어 있다고 생각합니다.

테스트를 실행하고 @Bean을 선언 할 때 응용 프로그램을 시작하기 전에 실행하고 싶은 SQL을 지정해야합니다. 스프링 부트는 빈 H2 db를 생성합니다. 당신이 (당신의 schema.sql이보기 테이블에 동일한 스크립트도 선언해야 mmu을 다스 려한다주의 src/test/resources

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) 
             .addScript("schema.sql")           
             .build(); 
} 

에 가정

또는 다른 당신이 원하는 :

이 시도 필요한만큼 addScript 호출을 연결할 수 있습니다.)

Repository으로 새 객체를 생성하여 엔티티를 만드는 방법을 사용해 본 적이 있을지 모르겠지만 그걸 결코 시도한 적이 없으며 분명히 작동하도록 제안하는 방식입니다.

어쨌든 h2-console으로 테스트를 실행하는 동안 H2 데이터베이스의 내용을 확인할 수도 있습니다. 29.4 (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html)에서 봄 문서에서

:

다음은 진실해야한다 : 당신은 웹 응용 프로그램을

  • 닷컴을 개발하고

    • .h2database :

      application.propertiesspring.h2.console.enabled = true을 추가 H2 당신은 당신이 봄 부츠의 개발자 도구를 사용하지 않는 경우

  • , 당신도 그렇게 할 수 봄 부츠의 개발자 도구를 사용하는

  • 클래스 패스에 파일

    그런 다음 H2 웹 콘솔을 기본 경로 http://domain:port/contextPath/h2-console에서 사용할 수 있어야하며 매 순간 내용이 무엇인지 확인해야합니다.

    도움이 되길 바랍니다. :)

  • +0

    글쎄, 나는 그것보다 깨끗한 해결책을 원했다. 어떻게 든 H2가 내 뷰 매핑을 인식하도록 할 수 있다면 좋았을 것입니다. 그러나 뷰에 엔티티 매핑이 작동하지 않는 것처럼 보입니다. (.... 오, 이런 관점의 이점은이 간단한 단점보다 중요합니다. 답변 주셔서 감사합니다! –