如何为具有多个地址的用户建模?

时间:2014-01-04 18:41:12

标签: java database hibernate orm domain-driven-design

我有一个用户实体。每个用户可以拥有一个或多个个人地址。根据{{​​3}},这是应该如何做的:

@Entity
public class User {
   [...]
   public String getLastname() { ...}

   @ElementCollection
   @CollectionTable(name="Addresses", joinColumns=@JoinColumn(name="user_id"))
   @AttributeOverrides({
      @AttributeOverride(name="street1", column=@Column(name="fld_street"))
   })
   public Set<Address> getAddresses() { ... } 
}

@Embeddable
public class Address {
   public String getStreet1() {...}
   [...]
}

现在,如果我希望用户也有工作地址的集合,我该怎么办?

以下是我的想法:

  1. 为工作地址和个人地址创建2个不同的集合,然后将它们映射到2个不同的表格。(听起来过于复杂化,因为两个地址完全相同)
  2. 将两个地址存储在同一个表格中。(但是,我不知道如何区分它们)
  3. 引入查找实体/值对象并以某种方式使用它来区分个人和工作地址。(从数据库的角度来看,我们将查找通过a链接的地址类型的查找表地址表的外键,但我不知道应该如何使用Hibernate在域中建模?
  4. 非常欢迎替代方法。

1 个答案:

答案 0 :(得分:1)

尝试使用休眠single table inheritance mapping

@Entity
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="addresstype",
    discriminatorType= DiscriminatorType.STRING)
public abstract class Address {
    ... common attributes here
}

@Entity
@DiscriminatorValue("home")
public class HomeAddress extends Address {
...

}

@Entity
@DiscriminatorValue("work")
public class WorkAddress extends Address {
...

}

然后创建两个集合,一个用于家庭地址,另一个用于工作地址。

如果存在仅对家庭地址有效的代码,那么我们使用HomeAddress类型,如果代码仅对我们使用WorkAddress的工作地址有效,则相同。

如果存在对两种地址类型都有效的代码,那么我们使用Address超类型。