【问题标题】:I should use Ebean or EbeanServer under what case?我应该在什么情况下使用 Ebean 或 EbeanServer?
【发布时间】:2015-12-08 03:49:57
【问题描述】:

我知道我可以使用EbeanEbeanServer 来访问数据库。 EbeanServer 比 Ebean 有更多的 API 方法,Ebean 上的许多方法,例如Ebean.find(Class) 等实际上只是调用“默认/主”EbeanServer 上的方法的便捷方式。

我的问题:

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

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

感谢您的建议。

EbeanServer api doc

Ebean api doc

【问题讨论】:

    标签: playframework ebean


    【解决方案1】:

    首先看待它的一种方式是,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 提供的所有api吗?

    是的,假设 EbeanServer 实例已注册(这是可选的)。参考 ServerConfig.setRegister(boolean) 和 ServerConfig.setDefaultServer(boolean)。

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

    在所有情况下,从技术上讲,您都在使用 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 访问它,以启用模型/查找器和活动记录样式。这在 DI 情况下是合理的,您希望对 EbeanServer 实例进行编程配置,但仍希望能够通过 Model 和 Finder 使用活动记录样式。

    测试:

    测试也涉及到这一点。 avaje-ebeanorm-mocker 项目专门提供了在通过 Ebean/Model/Finder 使用 EbeanServer 实例时模拟它们的机制,因此在使用 avaje-ebeanorm-mocker 时,它可以提供与使用传统注入时相同的可测试性级别的 EbeanServer。

    问:Ebean 是否适合通过配置文件创建 EbeanServer?

    嗯,是的,不是的。对我来说,您首先要说“我们是否使用 DI/Guice/Spring”,通常如果您是,那么您有一个 guice 提供程序/spring 工厂 bean 来创建 EbeanServer 实例(因为具有更高级 EbeanServer 功能的编程配置是件好事- 例如注入 CurrentUserProvider 实现)。然后,您还选择了是否要向 Ebean 单例注册 EbeanServer 实例,并且这样还可以使用 Model/Finder/Ebean。

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

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

    希望对您的一些问题有所帮助。

    干杯,罗伯。

    【讨论】:

      【解决方案2】:

      当您想使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 2016-03-15
        • 2015-12-02
        • 2011-05-20
        • 1970-01-01
        • 2018-11-11
        • 2015-02-13
        • 1970-01-01
        相关资源
        最近更新 更多