2016-07-20 10 views
1

Ich habe eine Entität, die einer SQL-Ansicht zugeordnet ist. Ich habe auch ein Spring-Data-Jpa-Repository dafür konfiguriert. Wenn die Anwendung ausgeführt wird, funktioniert alles OK. Das Problem beginnt jedoch, wenn ich versuche, meine Tests auszuführen, die eine speicherinterne H2-Datenbank verwenden. Ich vermute den Grund dafür ist, dass die Ansicht nicht vorhanden ist, wenn H2 startet, und es wird wahrscheinlich als eine unabhängige Entität behandelt, und daher konfiguriert Spring Boot sie als eine unabhängige In-Memory-Tabelle.Wie initialisiere ich eine Ansicht in H2

Die Konfiguration für die H2-Datenbank wie unten ist -

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

Ich habe versucht, die Sichtdefinition in der schema.sql Datei in den Testressourcenordnern setzen -

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 

Allerdings ist es nicht helfen entweder. Also, wenn ich nenne das konfigurierte JPA-Repository in meinen Tests -

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

so -

myViewRepository.findAll() 

es gibt eine leere Liste, obwohl ich erstellen alle m, mu und u Einheiten in meinen Tests Verwenden Sie die zugehörigen Repositories vor dieser Suche.

Wie kann ich H2 so konfigurieren, dass es meine Ansichtsdefinition aufnimmt?

Antwort

1

Ich vermute, dass Sie eine andere DataSource für Ihre Integrations- oder Produktionsumgebung deklarieren, die eine Verbindung mit einer bereits erstellten Datenbank herstellt und die erwartete Sicht deklariert.

Wenn Sie Tests ausführen und Ihre @Bean deklarieren, sollten Sie wahrscheinlich angeben, welche sql Sie ausführen möchten, bevor die App startet. Spring Boot erstellt eine leere H2 db.

Try this:

Angenommen, Ihre schema.sql ist in src/test/resources

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

Darauf achten, dass Ihre Ansicht Tabellen m und mu ist beziehe, die im selben Skript auch erklärt oder eine andere Sie wollen werden soll (Sie kann so viele AddScript-Aufrufe verketten, wie Sie möchten/brauchen).

Vielleicht ist Ihr Ansatz der Schaffung der Entitäten durch die Schaffung neuer Objekte mit der Repository es auch korrekt ist, aber ich habe es noch nie versucht, und die Art, wie ich Ihnen vorschlagen, funktioniert sicher.

Wie auch immer, Sie können auch überprüfen, was der Inhalt der Embed H2-Datenbank ist, während Sie Tests mit der h2-console ausführen.

Von Frühling Dokumentation bei 29,4 (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html):

Folgendes sollte wahr sein:

  • Sie sind eine Web-Anwendung
  • com entwickeln.h2database: h2 ist auf dem Classpath
  • Sie sind mit Spring-Boot-Entwickler-Tools

Wenn Sie nicht Frühling Boot-Entwickler-Tools verwenden, können Sie das auch tun:

spring.h2.console.enabled = true hinzufügen in application.properties Datei

Dann sollten Sie in der Lage sein, die H2-Webkonsole im Standardpfad http://domain:port/contextPath/h2-console zu verwenden und zu überprüfen, was der Inhalt in jedem Moment ist.

Hoffe, dass hilft :)

+0

Nun, ich wollte eine sauberere Lösung als das. Es wäre großartig gewesen, wenn ich H2 hätte zwingen können, meine Ansichtszuordnung zu erkennen, aber es scheint, dass die Zuordnung einer Entität zur Ansicht nicht funktioniert :(... naja, ich schätze, der Vorteil dieser Ansicht überwiegt diesen einfachen Nachteil. Vielen Dank für Ihre Antwort! –

Verwandte Themen