java - Spring jpa实体和动态调度

标签 java spring jpa strategy-pattern

我有实体动物。它有两个 child :狗和猫。动物可以 makeVoice(),但猫和狗的做法不同。

现在有一个问题,使用 Hibernate 我会检索 Dog 的实例,在 Dog 的 makeVoice() 方法中我会调用 HumanService,但它是 Spring bean,单例。我应该如何围绕这个进行设计?注入(inject)/ Autowiring HumanService 看起来像是污染猫/狗,但这必须动态解决。我想不出一种方法可以在外面设计这个分辨率。有这样的办法吗?

最佳答案

如果您的动物调用服务,您的设计似乎是领域驱动的,但并不完全。 如果你有 DDD,我不会将其称为 HumanService,因为有 Service 后缀。我想象狗不会直接与人交流。

我认为您应该尝试通过服务层或域对象之间的通信进行推理,而不是它们的混合。当然,在 DDD 中,您可以拥有服务,但当它相关时,不能用于域的两个对象之间的通信。

关于混合 spring beans 和 JPA 实体,看起来确实有点尴尬,不是在逻辑上,而是在你使用两个不同的库在同一个类上编织行为的事实。
JPA 不使用Spring 实例化实体,因此您应该使用技巧来完成这两件事。 如果您可以避免在实体中使用 Spring,而不需要增加大量开销来添加逻辑,我认为您的设计可能会更干净。否则,请使用技巧。

如果混合两者让您烦恼,请不要使用 DDD,而是使用服务设计:DogService 使用以狗作为参数的方法与 HumanService 进行通信

关于java - Spring jpa实体和动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168684/

相关文章:

java - 未生成 hibernate 序列

jquery - iframe 忽略后的 HTML

java - 使用 LEFT JOIN 和 GROUP BY 的 JPQL 查询

java - JPA JPQL : SELECT NEW with COUNT, GROUP BY 和 ORDER BY

java - TextArea 高度问题

java - 如何保存我的 Android 应用程序,以便最终用户无需 Android SDK 即可执行它

java - 媒体播放器不播放shoutcast广播流

java - Java 中的列表不起作用

java - Thymeleaf:更新表单提交表

java - 具有继承的单向多对一关系