13

我们正在使用 Play Framework 2.0.3 设置一个稍微复杂的项目。

我们需要访问几个数据库(预先存在的),并希望使用框架内置设施(即 EBean)来完成它。

我们尝试在“models”包中创建所有模型类,然后将每个类及其 FQN 映射到 application.conf 中相应的 EBean 属性:

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's 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()

有任何想法吗?

谢谢!里卡多

4

5 回答 5

9

您必须在查询中指定要访问的数据库。

例如,如果您想从您的 secondDB 检索所有用户:

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

// Get all users in secondDB
List<User> userList = secondDB.find(User.class).findList(); 
于 2013-07-01T08:41:40.053 回答
2

使用save()、或时delete(),您必须指定 Ebean 服务器,例如save()方法:update()refresh()

classA.save("firstDB");
于 2012-08-30T18:34:48.690 回答
1

我也遇到过同样的问题,浪费了一整天的时间去调查,终于搞定了。

1.定义命名的eabean服务器

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 服务器 [default] 和 [aux]。

2.app conf文件ebean.default="models.*"

ebean.aux= "secondary.*"

现在包models.*下的实体配置为[default]服务器,包secondary.*下的实体配置为[aux]服务器。我认为这可能与java类增强或其他东西有关。您不需要将实体分成不同的包,但是如果不同的ebean服务器的实体在同一个包下,可能会导致奇怪的麻烦和异常。

  1. 使用您的模型时,保存/删除/更新相关方法应添加服务器名称作为参数

    学生 s = new Student(); s.save(“辅助”);

  2. 使用 finder 时,应将 finder 定义为

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

于 2016-08-28T16:49:13.840 回答
0

可能不是同一种情况,我在 Play 2.1.0 中跑到了这个SomeClass 而不是增强的 PersistenceException,唯一缺少的是我忘记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!!)
于 2013-06-27T11:50:40.967 回答
0

这解决了我保存到我的数据库表并解决错误的问题:

“javax.persistence.PersistenceException:尚未定义默认 EbeanServer?这通常通过 ebean.datasource.default 属性设置。否则应通过 registerServer() 以编程方式注册”

于 2013-08-10T15:15:55.767 回答