Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重头戏:bean类没有得到增强,使用的是EbeanServerFactory_Java_Playframework_Playframework 2.0_Ebean - Fatal编程技术网

Java 重头戏:bean类没有得到增强,使用的是EbeanServerFactory

Java 重头戏:bean类没有得到增强,使用的是EbeanServerFactory,java,playframework,playframework-2.0,ebean,Java,Playframework,Playframework 2.0,Ebean,使用PlayFramework2.4.2,我必须连接到一个可以离线的远程数据库 我试图避免启动时出现“无法连接到数据库[distantdatabase]”异常 在尝试了很多方法之后,我决定手动创建一个EbeanServerFactory来访问这个远程数据库 这是我的模型: @Entity @Table(name="vehicules") public class Vehicule { @Id public Long id; public Long noParc;

使用PlayFramework2.4.2,我必须连接到一个可以离线的远程数据库

我试图避免启动时出现“无法连接到数据库[distantdatabase]”异常

在尝试了很多方法之后,我决定手动创建一个EbeanServerFactory来访问这个远程数据库

这是我的模型:

@Entity
@Table(name="vehicules")
public class Vehicule {
    @Id
    public Long id;
    public Long noParc;
    public Long etat;
}
这就是我试图访问数据的方式

// Classes of distant database
List<Class<?>> saetrClasses = new ArrayList<Class<?>>();
saetrClasses.add(Vehicule.class);

// Access configuration to distant database
DataSourceConfig ds = new DataSourceConfig();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/distantdatabase");
ds.setUsername("stack");
ds.setPassword("overflow");

ServerConfig saetrServerConfig = new ServerConfig();
saetrServerConfig.setName("distantdatabase");
saetrServerConfig.setDefaultServer(false);
saetrServerConfig.setClasses(saetrClasses);
saetrServerConfig.setRegister(false);
saetrServerConfig.setDataSourceConfig(ds);

Logger.warn("EbeanServerFactory.create...");

EbeanServer saetrServer = EbeanServerFactory.create(saetrServerConfig);

saetrServer.find(Vehicule.class).where().gt("lastMaj", lastRequestTime).findList();
plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
我得到以下错误

[warn] - application - EbeanServerFactory.create...
[error] - com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager - Error in deployment
java.lang.IllegalStateException: Bean class models.distantdatabase.Vehicule is not enhanced?
[...]
我不理解这个错误。我看了很多例子,没有发现我遗漏了什么。有什么想法吗

编辑:我查看了ebean的源代码,发现这个错误是因为我的模型并没有实现EntityBean接口。
如何强制实现此接口?

您需要声明要增强哪些类。在application.conf中,添加以下内容:

ebean.distantdatabase = ["models.distantdatabase.*"]

我认为您需要确保急切地创建了
EbeanServer
(只是一个猜测,我以前没有尝试过您的方法)。

我终于明白了,数据库模型与ebean期望的不完全一样

为了解决这个问题,我为本地数据库添加了application.conf参数:

ebean.distantdatabase="models.distantdatabase.*"
play.evolutions.db.distantdatabase.enabled=true
play.evolutions.db.distantdatabase.autoApply = true
db = {
  saetr {
    driver=com.mysql.jdbc.Driver
    url="jdbc:mysql://localhost/distantdatabase"
    username=play
    password=framework
  }
}
我在mySQl服务器上创建了一个空数据库“distantdatabase”。 我有一次启动了我的应用程序。它在数据库中创建了表,并创建了表创建sql脚本(/conf/evolutions/distantdatabase/1.sql)。 有了这个文件,您就可以确切地知道ebean所期望的数据库模型

然后,要使用远程数据库(可能处于脱机状态),您不需要在application.conf中声明关于它的任何内容,而是声明一个ServerConfig,如下所示:

ServerConfig saetrServerConfig = new ServerConfig();
saetrServerConfig.setName("distantdatabase");
saetrServerConfig.setDdlGenerate(false); // ddlGenerate drops all tables and create new tables
saetrServerConfig.setDdlRun(false); // ddlRun run migration scripts
saetrServerConfig.setDefaultServer(false);
saetrServerConfig.setRegister(true);
saetrServerConfig.setDataSourceConfig(ds);
saetrServerConfig.setClasses(saetrClasses);

您可以从ebean测试中找到示例:

我试过了,当远程数据库联机时,这就起作用了。但当它脱机时,启动时会出现异常(配置错误[无法连接到数据库[distantdatabase]])。
ServerConfig saetrServerConfig = new ServerConfig();
saetrServerConfig.setName("distantdatabase");
saetrServerConfig.setDdlGenerate(false); // ddlGenerate drops all tables and create new tables
saetrServerConfig.setDdlRun(false); // ddlRun run migration scripts
saetrServerConfig.setDefaultServer(false);
saetrServerConfig.setRegister(true);
saetrServerConfig.setDataSourceConfig(ds);
saetrServerConfig.setClasses(saetrClasses);