在实体Bean中使用无状态EJB Bean

6
显然,在实体bean中使用无状态EJB bean会有问题,但请考虑以下场景,并告诉我是否知道更好的解决方案:
1. 我有一个名为InvoiceTemplate的实体bean,其中包含字段NextInvoiceDate。 2. 生成NextInvoiceDate是一个复杂的过程,应该在InvoiceTemplate类外执行。 3. 每次将InvoiceTemplate存储到数据库时,都应更新NextInvoiceDate。
目前,在InvoiceTemplate实体bean中,关于生成NextInvoiceDate的逻辑已经写在了@PrePersist和@PreUpdate方法中。这个逻辑变得越来越复杂,我想将其移出InvoiceTemplate实体bean。看起来应该有一个服务来计算NextInvoiceDate。但是,从InvoiceTemplate内部调用这个服务是正确的吗?

它是一个实体Bean(EJB 2.0)还是JPA实体? - Bozho
2个回答

3
这不是一种气味,而是对面向领域驱动设计的倾向。
我不知道有没有自动执行此操作的方法,但您可以:
在处理Invoicetemplate的会话bean中注入带有计算下一个日期逻辑的助手bean。
创建具有实体setter的私有字段,并在开始使用之前调用entity.setNextDateHelper(..)
您还可以检查AspectJ是否提供了某些EJB选项,以便在创建给定类型(InvoiceTemplate)的实体时注入EJB。 AspectJ与spring bean类似,我不知道是否有这样的EJB选项。

说得好。+1 只为第一句。 - Adeel Ansari

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

这样做会伤害测试。 - mgamer
1
那么,如果确实需要与数据库交互并且需要大量对象协作呢? - musiKk
1
如果是这样,那么你可能又要回到服务或EJB中,以便可以参与事务或共享上下文。这会带回时间问题、协调和依赖性。 - TMN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接