Невозможно использовать несколько баз данных ebean в Play 2

Мы создаем немного сложный проект, используя Play Framework 2.0.3.

Нам нужно получить доступ к нескольким базам данных (уже существующим) и сделать это с использованием встроенных средств фреймворка (например, EBean).

Мы попытались создать все классы моделей в пакете "models", а затем сопоставить каждый класс с его FQN с соответствующим свойством EBean в application.conf:

ebean.firstDB="models.ClassA,models.ClassB,models.ClassC"
ebean.secondDB="models.ClassD"
ebean.thirdDB="models.ClassE,models.ClassF"

Это не работает:

PersistenceException: Error with [models.SomeClass] It has not been enhanced but it superClass [class play.db.ebean.Model] is? (You are not allowed to mix enhancement in a single inheritance hierarchy) marker[play.db.ebean.Model] className[models.SomeClass] 

Мы проверили и повторно проверили, и конфигурация в порядке!

Затем мы попытались использовать другой пакет Java для каждого класса модели базы данных и соответствующим образом сопоставить их в application.conf:

ebean.firstDB = "packageA.*"
ebean.secondDB = "packageB.*"
ebean.thirdDB = "packageC.*"

Это отлично работает при чтении информации из базы данных, но когда вы пытаетесь сохранить/обновить объекты, мы получим:

PersistenceException: The default EbeanServer has not been defined? This is normally set via the ebean.datasource.default property. Otherwise it should be registered programatically via registerServer()

Любые идеи?

Спасибо! Рикардо

Ответ 1

Вы должны указать в своем запросе, к какой базе данных вы хотите получить доступ.

Например, если вы хотите извлечь всех пользователей из вашего второгоDB:

// Get access to your secondDB
EbeanServer secondDB = Ebean.getServer("secondDB");

// Get all users in secondDB
List<User> userList = secondDB.find(User.class).findList(); 

Ответ 2

При использовании save(), delete(), update() или refresh() вам необходимо указать сервер Ebean, например, для save ( ):

classA.save("firstDB");

Ответ 3

Я столкнулся с одной и той же проблемой и потратил целый день, чтобы исследовать ее, наконец, я получил ее.

1.define с именем eabean server

db.default.driver=com.mysql.jdbc.Driver 
db.default.url="jdbc:mysql://localhost:3306/db1"
db.default.user=root
db.default.password=123456

db.aux.driver=com.mysql.jdbc.Driver
db.aux.url="jdbc:mysql://localhost:3306/db2"
db.aux.user=root
db.aux.password=123456

теперь у вас есть два сервера ebean [по умолчанию] и [aux] во время выполнения.

2.app conf file   ebean.default = "модели. *"

ebean.aux= "secondary.*"

Теперь подключается в рамках моделей пакетов. * настроен на [по умолчанию] сервер и сущности под вторичным пакетом. * настроен на сервер [aux]. Я думаю, это может быть связано с повышением класса Java или чем-то еще. Вам не нужно отделять объекты в разных пакетах, но если сущности разных серверов ebean находятся в одном пакете, это может вызвать странные проблемы и исключения.

  1. При использовании вашей модели метод сохранения/удаления/обновления должен добавлять имя сервера в качестве параметра

    Студент s = новый Student(); s.save( "AUX" );

  2. Когда вы используете finder, вы должны определить своего искателя как

    public static Finder find = new Finder ( "aux", Long.class, Student.class);

Ответ 4

Возможно, не тот и тот же случай, я побежал к этому SomeClass, не улучшенному PersistenceException с Play 2.1.0, и только то, чего не хватало, было объявление public в классе модели SomeClass, которое я забыл..

В Play 2.1.0 сообщение об ошибке несколько изменилось:

PersistenceException: java.lang.IllegalStateException: Class [class play.db.ebean.Model] is enhanced and [class models.Address] is not - (you can not mix!!)

Ответ 5

Это решило мою проблему с сохранением моей таблицы db и разрешило ошибку:

"javax.persistence.PersistenceException: EbeanServer по умолчанию не определен? Обычно это устанавливается через свойство ebean.datasource.default. В противном случае он должен быть зарегистрирован программно через registerServer()"