【问题标题】:Using stateless EJB beans in an Entity Bean在实体 Bean 中使用无状态 EJB bean
【发布时间】:2010-09-13 11:13:39
【问题描述】:

显然在实体 bean 中使用无状态 EJB bean 有异味,但请考虑以下场景并告诉我您是否知道更好的解决方案:

  1. 我有一个 InvoiceTemplate 实体 Bean,其字段为 NextInvoiceDate
  2. 生成NextInvoiceDate 是一个复杂的过程,应在InvoiceTemplate 类之外执行
  3. 每次将InvoiceTemplate 存储到数据库时,都应更新NextInvoiceDate

现在我有关于 @PrePersist @PreUpdateInvoiceTemplate 实体 bean 中生成 NextInvoiceDate 的逻辑。逻辑越来越复杂,我想把它移到InvoiceTemplate 实体bean 之外。在我看来,应该有一个服务来计算NextInvoiceDate。但是从InvoiceTemplate内部调用这个服务是否正确?

【问题讨论】:

  • 它是实体 bean (EJB 2.0) 还是 JPA 实体?

标签: java jpa ejb-3.0


【解决方案1】:

它不是那种味道——它倾向于领域驱动的设计。

我不知道有什么方法可以自动执行此操作,但您可以:

  • 在您处理 Invoicetemplate 的会话 bean 中,注入具有计算下一个日期的逻辑的辅助 bean
  • 在实体上创建一个带有 setter 的私有字段,并在开始使用它之前调用 entity.setNextDateHelper(..)

您还可以检查 AspectJ 是否不提供某些 EJB 选项,以便在创建给定类型 (InvoiceTemplate) 的实体时注入 EJB。 AspectJ 与 spring bean 一样,我不知道 EJB 是否有这样的选项。

【讨论】:

  • 说得好。 +1 仅针对第一句话。
【解决方案2】:

您需要像服务或 EJB 这样复杂的东西吗?您可以只编写一个静态方法(可能在实用程序类上)来保存逻辑吗?通常我对这类事情有很大的偏见,但如果你所拥有的只是一些不需要任何数据库交互或大量对象协作的复杂逻辑,它可能是最简洁的方法。

【讨论】:

  • 测试会以这种方式受到伤害。
  • 好吧,如果它确实需要数据库交互和大量对象协作怎么办?
  • 如果是这样,那么您可能会再次回到服务或 EJB,因此您可以参与事务或共享上下文。这让您回到了时间问题、协调和依赖关系。
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多