【发布时间】:2014-08-27 18:20:48
【问题描述】:
假设我有以下聚合根:
class Order {
private Collection<OrderItem> items;
...
public void updateQuantity(int itemId, int quantity) { ... }
}
假设我使用纯 SQL 来持久化它。问题是:如何在不暴露集合的情况下保留 Order 及其项目?我看到了几种我不喜欢的方式:
1) 添加一个返回复制集合的方法。我不喜欢它,因为我们还需要复制每个项目(因为它是实体并且可以更改),这本身就是另一个挑战。
2) 为项目的每个属性添加 getter:
class Order {
public int getQuantity(int itemId) { ... }
}
这样更好,因为外部没有人不能更改根的嵌套实体。但是它可以用大量的虚拟吸气剂来破坏根类。
3) 使用Hibernate方式:通过java在repository中的反射获取item。那是作弊”。我也在考虑创建 DTO 的方式,所以我需要一种合法的方式来读取这些值。
4) 使该字段使用默认修饰符并将存储库实现(以及 DTO 的汇编器)放入同一个包中,以便它可以访问这些字段。不喜欢它,因为存储库实现不是域的一部分。
我更喜欢第二种方法,但我可能还缺少其他方法?
【问题讨论】:
标签: java hibernate persistence domain-driven-design aggregate