Несколько баз данных с Play Framework 2.1.x

У меня есть 2 базы данных, с которыми мне нужно подключиться. Я могу легко подключиться к ним в файле application.conf следующим образом:

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.*"

У меня есть классы моделей в этих пакетах, и он создает таблицы правильно.

Проблема заключается в фактической работе с этими объектами. Все, что не в пакете "по умолчанию", выдает эту ошибку (например, в таблице "Пользователи" в дополнительной базе данных)

Если я попытаюсь запросить все строки таблицы:

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

Он выдает эту ошибку:

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

Несмотря на то, что я на 100% уверен, что таблица "Users" присутствует в бэкэнд, это зарегистрированная таблица, в которой работает DDL, и делает эту таблицу правильно, и я импортирую соответствующие классы.

Есть ли какой-то способ, который мне нужен, чтобы запрашивать классы моделей, которые не входят в пакет по умолчанию?

EDIT: Я понимаю, что трассировка стека показывает, что она пытается использовать DefaultServer. Как я могу использовать вторичный сервер?

    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]

Ответы

Ответ 1

Хорошо, ваш application.conf кажется правильным.

Вы можете использовать дополнительный сервер следующим образом:

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

После того, как вы приобретете свой вторичный сервер, вы можете рассматривать его так же, как вы относитесь к синглону Ebean.

Ответ 2

У меня была та же проблема, и я исправил ее, указав имя сервера на уровне Model.Finder.

Итак, в вашем случае в вашем классе User вы должны иметь что-то вроде:

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

Ответ 3

Вы можете использовать оба:

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

и

Ebean.getServer("secondary");

Но вы должны использовать метод сохранения с объявлением сервера на своей сущности

public void save(String server)

Без save() ebean использует сервер по умолчанию, даже на вашей пользовательской сущности!