使用 DDD 映射用户、地址、国家/地区

Posted

技术标签:

【中文标题】使用 DDD 映射用户、地址、国家/地区【英文标题】:Map User, Address, Country with DDD 【发布时间】:2012-02-04 22:05:01 【问题描述】:

我正在尝试使用 spring、hibernate 以及第一次遵循 DDD 创建一个电子商务网站。

目前的情况是这样的。我正在考虑将对象 USER 作为聚合根,它有一个地址列表(以前的..和当前的),并且每个地址都关联一个国家(isocode,名称)..

我假设 Address 和 Country 是 Value Objects.. 与用户严格相关。

在@Entity 类 User 中有: @ElementCollection @CollectionTable(name = "addresses", joinColumns = @JoinColumn(name = "address_id")) @OrderColumn(name="user_id") 私有列表地址;

在 @Embeddable 类 Address 中,我想为 Country 创建一个单独的表,我可以在初始化期间填充该表,并且 Address 只有一个外键。

我尝试了@Embeddable Country 和地址 @嵌入式 私人国家/地区

还有@SecondaryTable .. 但这只能在@Entity 类中使​​用。所以问题是Country 的字段保存在地址表中。

我应该为 Country 创建一个 @Entity 吗?或者还有其他方法来映射这些类?

谢谢

【问题讨论】:

我通常不喜欢做绝对的陈述,但在这种情况下我会破例.... 你绝对,绝对不应该让数据库架构有任何影响域模型的设计。 DDD 101。 【参考方案1】:

我真的不明白将Country 设为嵌入式对象有什么意义。您将一次又一次地为所有用户重复相同的代码和名称,而不是让他们都指向同一个国家。只需有一个包含所有国家/地区的表格,由实体映射,并让所有地址引用与国家/地区具有ManyToOne 关联。

顺便说一句,如果你想设计一个必须输入地址的 UI,我想你需要一个选择框来显示所有可供选择的国家:你不会输入国家的代码和名称每次手动。所以你需要一个Country 实体和一个findAll 方法来获取它们并填充你的选择框。

【讨论】:

以上是关于使用 DDD 映射用户、地址、国家/地区的主要内容,如果未能解决你的问题,请参考以下文章

将 IP 地址与国家/地区相关联[关闭]

Azure 上的网站如何识别不同国家和地区的用户

在Java Servlet中自动为用户选择国家/地区和语言

使用 IP 地址自动填写访问者所在国家/地区的表单

使用PHP取得用户IP地址的所在地区

基于国家/地区的基于IP的内容[重复]