我应该在什么情况下使用Ebean或EbeanServer?

时间:2015-12-08 03:49:57

标签: playframework ebean

我知道我可以使用EbeanEbeanServer来访问数据库。 EbeanServer有比Ebean更多的API方法,Ebean上的许多方法,例如Ebean.find(Class)等,实际上只是在'default / primary'EbeanServer上调用方法的一种方便方法。

我的问题:

  • 我可以通过调用Ebean.getServer(String name)来使用EbeanServer提供的所有apis来获取EbeanServer对象吗?
  • 在什么情况下我应该使用Ebean而不是EbeanServer(反之亦然)?
  • EbeanServer是否适合以编程方式创建EbeanServer?
  • Ebean适合通过配置文件创建EbeanServer吗?

在Play 2.4中,不需要ebean.properties,ebean配置可以放在application.conf中,我想我应该在Play framwork 2.4中使用Ebean,对吗?

感谢您的建议。

EbeanServer api doc

Ebean api doc

2 个答案:

答案 0 :(得分:6)

首先,查看它的一种方法是Ebean拥有EbeanServer实例的寄存器/映射,其中一个实例可以定义为默认服务器。

但是没有要求使用Ebean或注册EbeanServer实例。也就是说,可以创建EbeanServer实例,而不是向Ebean注册,这样你就不需要/使用/想要Ebean(更纯粹的DI风格)。

不同地说 - EbeanServer是真实/实际的实现,你必须有一个EbeanServer实例。您可以选择使用Ebean注册EbeanServer实例(大多数人都这样做),如果您注册了EbeanServer实例,那么它将可供Ebean单例使用,而Ebean上的方法是快速快捷方式。

您可以使用两者,这在依赖注入方案中是合理的(请参阅http://ebean-orm.github.io/docs/setup/guice)。因此,您使用Guice提供程序或Spring工厂bean创建EbeanServer实例,并将该实例注册到Ebean单例。通过这种方式,您可以使用DI(Guice / Spring)同时获取@Inject EbeanServer实例,同时通过Ebean.getDefaultServer()获取完全相同的EbeanServer实例(并且这样也使用Model / Finder / Ebean ala活动记录)

关于你的问题:

问:EbeanServer是否适合以编程方式创建EbeanServer?

EbeanServerFactory用于创建EbeanServer实例。请参阅http://ebean-orm.github.io/docs/setup/serverconfig

问:我可以通过调用Ebean.getServer(String name)来获取EbeanServer对象以使用EbeanServer提供的所有apis吗?

是假设EbeanServer实例已注册(可选)。请参阅ServerConfig.setRegister(boolean)和ServerConfig.setDefaultServer(boolean)。

问:在什么情况下我应该在EbeanServer上使用Ebean(反之亦然)?

在所有情况下,您在技术上都使用EbeanServer实例,所以这真的是一个样式问题。当实例注册为默认服务器等时,您可以可选通过Ebean单例访问EbeanServer实例。

在我称之为"传统依赖注入" 样式的情况下,您根本不会使用Ebean。使用Guice / Spring等将EbeanServer实例注入到您的服务中。

在我所谓的"活动记录" 样式中,您喜欢使用Model / Finders / Ebean产生的简单和相对干净的代码。我在http://ebean-orm.github.io/docs/setup/activerecord

讨论这种风格

总之,使用Ebean或EbeanServer之间的选择是一个风格问题。我将这些描述为"传统DI"和"活跃记录"样式。

现在我还需要指出,在DI情况下,如果需要,可以使用这两种样式。您可以@Inject EbeanServer实例并通过Ebean访问它以启用模型/ Finder和活动记录样式。这在DI情况下是合理的,在这种情况下,您需要对EbeanServer实例进行编程配置,但您仍希望能够通过模型和查找器使用活动记录样式。

<强>测试

测试也进入了这个阶段。 avaje-ebeanorm-mocker项目专门提供了在通过Ebean / Model / Finder使用时模拟EbeanServer实例的机制,因此在使用avaje-ebeanorm-mocker时提供了与使用传统注入时相同的可测试性水平EbeanServer。

问:Ebean适合按配置文件创建EbeanServer吗?

是的,不是。对我来说,你首先要说的是#34;我们是否正在使用DI / Guice / Spring&#34;通常,如果你那么你有一个guice提供者/ spring工厂bean来创建EbeanServer实例(因为使用更高级的EbeanServer特性进行编程配置是很好的 - 例如注入CurrentUserProvider实现)。然后,您还要选择是否要使用Ebean单例注册EbeanServer实例,并以此方式另外能够使用Model / Finder / Ebean。

就配置文件而言,我的想法是,即使在编程配置中,也可以使用外部属性配置,因此首先使用serverConfig.loadFromProperties(属性),然后以编程方式将内容设置为serverConfig。这使您能够(即使您最初没有使用它)通过属性/文件进行外部环境特定配置。

如果您根本不使用依赖注入(小型简单app等),那么Ebean和ebean.properties是一种非常快速的简单机制。

希望这有助于解决您的一些问题。

干杯,罗布。

答案 1 :(得分:0)

当您想使用Ebean时,您的模型应该扩展Ebean class。在那种情况下:

public class Task extends com.avaje.ebean.Model {}

当您创建静态查找器时,您也可以使用类查询:

List<Task> tasks = Task.find.all();

你读过:https://www.playframework.com/documentation/2.4.3/JavaEbean

特别是这部分:https://www.playframework.com/documentation/2.4.3/JavaEbean#Configuring-the-runtime-library