我在数据库中有一个类似于“国家/省/市”的列,例如“加拿大/安大略/多伦多”。我需要拆分它们并将它们映射到3个独立的Java Bean属性中。
我想知道哪里做得最好?
(1)检索行时的DAO (2)作为setter的域(Bean)被称为getter (3)用于解析查询中的行的SQL函数 (4)使用ResultSetExtractor
我倾向于#2或#4,因为“Anemic Domain”反模式似乎表明Bean适合这个。
答案 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已经有三个字段,那就更清洁了。