播放2.6和Ebean的多数据库源不起作用

时间:2017-10-03 10:15:53

标签: playframework playframework-2.6

我有2.6.5版本的Play和多模块(几个sbt子模块)配置。我设置了2个不同的数据源并有Ebean错误:

Caused by: javax.persistence.PersistenceException: models.common.defaultStorage.PromoBlock is NOT an Entity Bean registered with this server?
    at io.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:1019)
    at io.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:975)
    at io.ebean.Finder.query(Finder.java:157)
    at models.common.defaultStorage.PromoBlock.findByProjectId(PromoBlock.java:84)

仅当我在application.conf中设置了2个数据源和相应的映射类设置时才会发生这种情况。

我的build.sbt

lazy val common = (project in file("modules/common")).enablePlugins(PlayJava, PlayEbean)

lazy val admin = (project in file("modules/admin")).enablePlugins(PlayJava, PlayEbean).dependsOn(common)

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean).aggregate(common, admin).dependsOn(common, admin)

我的ebean实体位于common模块中。我在application.conf项目中只有一个root和两个数据源:

db {
    default.driver = org.postgresql.Driver
    default.url = "postgres://..."

    mssql.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
    mssql.url = "jdbc:sqlserver://..."
}

ebean.default = ["models.common.defaultStorage.*"]
ebean.mssql = ["models.common.mssqlStorage.*"]

我发现如果我注释掉第二个ebean.mssql选项,那么一切都还可以。但是有了两个不同的映射类列表,我得到了异常。

我尝试使用文档https://www.playframework.com/documentation/2.6.5/JavaEbean中的所有说明,但仍然没有成功。

我的plugins.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.5")

...

addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.0.3")

P.S。我正在从2.4(以及之前的2.3版)Play中迁移项目,其中一切正常。

2 个答案:

答案 0 :(得分:3)

事实上,我已经在play-ebean项目上开了一个公关。

在我们的项目中,我们设置了一种解决方法。但是我们使用的是Play2和Guice的Java版本。我不知道如何在Scala中应用此解决方案。 在Module类中,我们将DefaultEbeanConfig.EbeanConfigParser绑定到我们自己的类。

bind(DefaultEbeanConfig.EbeanConfigParser.class).to(CustomEbeanConfigParser.class);

此课程的代码:

@Singleton
public class CustomEbeanConfigParser extends DefaultEbeanConfig.EbeanConfigParser implements Provider<EbeanConfig> {


    private final Config _config;

    @Inject
    public CustomEbeanConfigParser(Config config, Environment environment, DBApi dbApi) {
        super(config, environment, dbApi);
        this._config = config;
    }

    @Override
    public EbeanConfig parse() {
        DefaultEbeanConfig ebeanConfig = (DefaultEbeanConfig) super.parse();

        Map<String, ServerConfig> serverConfigMap = ebeanConfig.serverConfigs();
        for (Map.Entry<String, ServerConfig> entry : serverConfigMap.entrySet()) {
            entry.getValue().setDefaultServer(entry.getKey().equals(ebeanConfig.defaultServer()));
        }

        return ebeanConfig;
    }
}

如您所见,我们使用提供的解析器的parse方法,在解析之后,我们修复了&#34; defaultServer&#34;属性。

答案 1 :(得分:2)

最新版本的play-ebean模块中的一个错误,它将所有已配置的数据源设置为默认值。拉请求已于9月6日开放,但仍未合并。

https://github.com/playframework/play-ebean/pull/125