2013-08-19 7 views
15

Ich habe 2 Datenbanken, die ich verbinden muss. Ich kann leicht wie so, um sie in der application.conf Datei verbinden:Mehrere Datenbanken mit Play Framework 2.1.x

db.default.driver=org.postgresql.Driver 
db.default.url="jdbc:postgresql://localhost/db1" 
db.default.user=postgres 
db.default.password="password" 

db.secondary.driver=org.postgresql.Driver 
db.secondary.url="jdbc:postgresql://localhost/db2" 
db.secondary.user=postgres 
db.secondary.password="password" 

ebean.default="models.db1.*" 
ebean.secondary="models.db2.*" 

ich meine Modellklassen in diesen Paketen haben, und es DDL erzeugt die Tabellen richtig.

Das Problem liegt in der tatsächlichen Arbeit mit diesen Entitäten. Alles, was nicht in dem „default“ Paket wirft diesen Fehler (die Benutzer-Tabelle in der sekundären Datenbank als Beispiel)

Wenn ich versuche, alle Zeilen der Tabelle abzufragen:

List<Users> users = Users.find.all(); 

Es wirft diese Fehler:

[PersistenceException: models.db2.Users is NOT an Entity Bean registered with this server?] 

Auch wenn ich 100% sicher bin, dass die Tabelle Benutzer im Backend ist, ist es eine registrierte Tabelle der DDL arbeitet und macht diese Tabelle richtig, und ich bin die richtigen Klassen zu importieren.

Gibt es eine bestimmte Möglichkeit, Modellklassen abzufragen, die nicht im Standardpaket enthalten sind?

EDIT: Ich weiß, dass der Stack-Trace zeigt, dass es versucht, den DefaultServer zu verwenden. Wie kann ich den sekundären Server verwenden?

at com.avaje.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:989) ~[avaje-ebeanorm-server.jar:na] 
    at com.avaje.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:946) ~[avaje-ebeanorm-server.jar:na] 
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:982) ~[avaje-ebeanorm-server.jar:na] 
    at play.db.ebean.Model$Finder.all(Model.java:254) ~[play-java-ebean_2.10.jar:2.1.3] 
+0

Niemand hat deine Frage schon beantwortet, also denke ich, anstatt deine 'EDIT:' an deine Frage anzufügen, solltest du sie einfach bearbeiten, um zu fragen, was du wirklich brauchst. –

+0

Anstatt models.db2. * In der applications.conf zu verwenden, versuchen Sie models.db2.Users zu verwenden. – Franz

+0

@GregKopff, sagte ich nur EDIT, weil ich nicht sicher war, ob jemand antwortete, während ich die Fragen redigierte. –

Antwort

7

Ok, Ihre application.conf scheint korrekt zu sein.

Sie können den sekundären Server wie folgt verwenden:

EbeanServer secondary = Ebean.getServer("secondary"); 
secondary.find(User.class).findList(); 

Sobald Sie Ihren sekundären Server haben, können Sie es behandeln können genauso wie die Ebean Singletons behandeln.

+0

Ja, ich habe diesen Ansatz ausprobiert, aber dann kommt das Problem, wenn man alles andere als nur das Auswählen von Daten tut. Mit dieser Methode kann ich beispielsweise alle Benutzer abrufen, aber die Benutzer verfügen über eine OneToMany-Beziehung mit einer anderen Klasse "Gruppen". Gruppen befinden sich auch in der sekundären Datenbank. In der Ansicht, ich möchte über alle Gruppen für jeden der Benutzer zuordnen, so habe ich ' @ user.groups.map {group => group.name}', aber das wirft diesen Fehler: '[PersistenceException : Abfrage hat SQLException ausgelöst: ERROR: Spalte t1.users_id existiert nicht ... 'obwohl diese Spalte existiert. –

6

Ich hatte das gleiche Problem, und ich habe es behoben, indem Sie den Server-Namen auf der Model.Finder-Ebene angeben.

Also in Ihrem Fall in Ihrer Benutzerklasse, sollten Sie so etwas wie haben:

public static Model.Finder<Long, User> find = new Finder<Long, User>("secondary", Long.class, User.class); 
+0

Wow, das ist genau das, was ich suche, leider funktioniert das nur für alles, was die Abfrage dieses Modells betrifft, aber jedes Mal, wenn ich einen Speicherbefehl für diesen Ansatz verwende, bekomme ich den Fehler 'Der Typ ____ ist kein registriertes Objekt? Wenn Sie die zu verwendenden Entitätsklassen nicht explizit auflisten, sucht Ebean im Klassenpfad nach ihnen. "Haben Sie Ideen, wie Sie das beheben können? (Ja, ich weiß, dass meine Modelle bereits korrekt erstellt wurden). –

+0

Sorry, ich verstehe es nicht. Wie versuchst du deine Objekte zu speichern? Ich mache 'Benutzer user = User.find.byId (aId); Benutzer.Update (aId); user.delete(); 'Es funktioniert gut, normalerweise ... – DrMabulle

+1

Seien Sie sich bewusst, dass Sie auch die Ebean save Methode, welchen Server mitteilen müssen! 'public void save (Zeichenfolgenserver)'. Verwenden Sie nicht die Standardmethode 'save()'. – myborobudur

4

Sie beide verwenden können:

public static Model.Finder<Long, User> find = new Finder<Long, User>("secondary", Long.class, User.class); 

und

Ebean.getServer("secondary"); 

Aber Sie haben Verwenden Sie die Save-Methode mit der Server-Deklaration für Ihre Entität

public void save(String server) 

Ohne save() Ebean verwendet den Standardserver, auch auf Ihre Benutzer-Entität!

Verwandte Themen