避免贫血领域

时间:2012-07-09 19:05:35

标签: java design-patterns

我在数据库中有一个类似于“国家/省/市”的列,例如“加拿大/安大略/多伦多”。我需要拆分它们并将它们映射到3个独立的Java Bean属性中。

我想知道哪里做得最好?

(1)检索行时的DAO (2)作为setter的域(Bean)被称为getter (3)用于解析查询中的行的SQL函数 (4)使用ResultSetExtractor

我倾向于#2或#4,因为“Anemic Domain”反模式似乎表明Bean适合这个。

4 个答案:

答案 0 :(得分:2)

我不确定我是否同意你的观点;您可以争辩说,域实体不需要受数据表示的影响 如果您的数据库布局不同,您会考虑使用带有setter和getter的bean吗? 我的答案是'不',那么你可能不想要那个选项。

就我个人而言,我认为如果你有一个数据访问层,这是其工作的一部分 - 将数据表示转换为域表示。

答案 1 :(得分:1)

恕我直言,这样做的最佳地点是数据库。我会将此列拆分为表中的3列,并按列存储一个信息。

如果由于遗留原因这确实不是一个选项,我确实会直接在域对象中执行此操作。这种行为可以直接封装在域对象中,而不会对其他实体产生任何影响。

答案 2 :(得分:0)

如果这是一个JPA @Entity,那么我会将一个私有String直接映射到DB列,然后创建包含对它的访问权限的公共getter。这样,域模型的使用者就会从连接字符串的内部/数据库表示中隔离出来。或者,您可以在@PostLoad回调中进行翻译。 (持久化的反向转换可以在@PrePersist回调中完成。)

答案 3 :(得分:0)

不是你的1.和4.实际上是同一个解决方案吗?我猜你在DAO代码中使用ResultSetExtractor。使用SQL函数并不是一个坏主意,因为它可以从其他技术中重用,但存在维护问题。

我不建议延迟解析直到获得时间,因为它从性能方面来说不好,并且在使用这些字段执行其他任务时可能会使您的生活变得复杂。如果您的bean已经有三个字段,那就更清洁了。