向 JPA 实体添加业务逻辑

Adding business logic to JPA entities

在下一个场景中,我必须将一些具有 JPA 规范的静态过滤器(添加 WHERE 子句)应用到 JPA 实体以获取过滤的狗列表,例如,我从一个实体收到一个 ID,并且我有应用相同的过滤器,但为每个未完成的过滤器发送错误消息。例如:拥有实体 Dog,我收到一个 id,使用 JPA 获取该实体并应用一些过滤器,例如 dog age>3 years 等...

我的想法是重用 JPA 规范来执行此操作,但使用它们不会向我提供有关我为何未获取实体以及未完成哪个过滤器以发送错误消息的信息。

我所做的是将 isDogOlderThan3Years() 之类的方法添加到 JPA 实体中,实体本身会为每个过滤器请求其属性等。我认为这与非贫血实体有关。这是 good/bad 解决方案吗?还有更好的吗?

谢谢

我认为 specification pattern 在这里很有用。

您可以使用 Visitor pattern 将规范组合转换为 JPA 查询,并且您可以实施上面文章中讨论的 remainderUnsatisfied 操作来找出给定候选者不满足哪些标准。

如果不关心关注点分离,可以直接在规范上实现toJpaFilterdescribe等方法 .

我在我的一个项目中使用了这种方法,在该项目中我设法重用相同的规范来执行以下操作并且效果很好:

  • 定义复杂的访问控制规则和过滤器
  • 定义和执行业务规则
  • 生成 user-friendly 规格说明