Несколько баз данных с 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 использует сервер по умолчанию, даже на вашей пользовательской сущности!