2013-08-19 12 views
15

Mam 2 bazy danych, z którymi muszę się połączyć. I można łatwo podłączyć do nich w pliku application.conf tak:Wiele baz danych w 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.*" 

Mam klas modelu w tych pakietach, a to generuje DDL tabel poprawnie.

Problem polega na tym, że faktycznie pracujemy z tymi podmiotami. Coś nie w „domyślnym” pakietu rzuca ten błąd (przy użyciu tabeli użytkowników we wtórnej bazy danych jako przykład)

Gdy próbuję kwerendy wszystkie wiersze tabeli:

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

rzuca to błąd:

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

chociaż jestem w 100% pewien, że tabela nie jest Użytkownicy w backend, że jest zarejestrowanym tabela DDL działa i sprawia, że ​​ten stół prawidłowo, a ja importowania odpowiednich klas.

Czy istnieje sposób, w jaki należy zapytać o klasy modelu, które nie znajdują się w domyślnym pakiecie?

EDYCJA: Rozumiem, że ślad stosu pokazuje, że próbuje użyć DefaultServer. Jak sprawić, by korzystał z serwera pomocniczego?

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

Nikt jeszcze nie odpowiedział na twoje pytanie, więc myślę, że zamiast dodawać twoje "EDYCJA:" do twojego pytania, powinieneś po prostu zmodyfikować to, by zapytać, co naprawdę potrzebujesz. –

+0

Zamiast używać models.db2. * W applications.conf, spróbuj umieścić models.db2.Users. – Franz

+0

@GregKopff, Powiedziałem tylko, że EDIT, ponieważ nie byłem pewien, czy ktoś odpowiada, podczas gdy ja redagowałem pytania. –

Odpowiedz

7

OK, Twój application.conf wydaje się być poprawny.

może korzystać z serwera pomocniczego tak:

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

Gdy masz swój serwer pomocniczy, można go traktować tak, jak traktuje Ebean singleton.

+0

Tak, próbowałem tego podejścia, ale problem polegał na zrobieniu czegokolwiek oprócz rzeczywistego WYBIERANIA dla danych. Na przykład za pomocą tej metody mogę uzyskać wszystkich użytkowników, ale użytkownicy mają powiązanie OneToMany z inną klasą "Grupy". Grupy znajdują się również w dodatkowej bazie danych. W widoku chcę mapować wszystkie grupy dla każdego z użytkowników, więc mam ' @ user.groups.map {group => group.name}', ale to powoduje ten błąd: '[PersistenceException : Query rzucił wyjątek SQLException: ERROR: kolumna t1.users_id nie istnieje ... 'mimo że kolumna istnieje. –

6

Miałem ten sam problem i naprawiłem go, podając nazwę serwera na poziomie Model.Finder.

Więc w twoim przypadku, w klasie użytkownika, należy mieć coś takiego:

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

Wow, to jest dokładnie to, czego szukam, niestety działa to tylko w przypadku jakichkolwiek zapytań dotyczących tego modelu, ale kiedy używam polecenia zapisu dla tego podejścia, pojawia się błąd "Typ ____ nie jest zarejestrowanym podmiotem? Jeśli nie zaznaczysz jawnie klas jednostek, aby użyć Ebean, wyszukasz je w ścieżce klas. "Czy masz jakieś pomysły, jak to naprawić? (Tak, wiem, że moje modele są już właściwie stworzone). –

+0

Przepraszam, nie rozumiem. Jak próbujesz zapisać swoje obiekty? Robię "User user = User.find.byId (aId); user.update (aId); user.delete(); 'To działa dobrze, zwykle ... – DrMabulle

+1

Pamiętaj, że musisz również poinformować metodę zapisu Ebean, który serwer! 'public void save (String server)'. Nie używaj domyślnej metody 'save()'. – myborobudur

4

można używać zarówno:

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

i

Ebean.getServer("secondary"); 

Ale trzeba używać metody składowania z deklaracją serwera w twoim podmiocie

public void save(String server) 

Bez ebean korzysta z domyślnego serwera, nawet na Twoim podmiocie użytkownika!