如果自然编号不可用,则在域模型中编号

时间:2019-03-07 20:12:15

标签: domain-driven-design persistence

假设我有一个没有自然ID的域模型。

class Offer {
  ClientId clientId;
  CompanyId companyId;
  OfferDetails details;
}

通过自动生成的密钥从数据库加载要约。然后将其修改为通过调用业务方法acceptrejectrenegotiate。为了坚持报价,我必须具有此自动生成的密钥。如何连接数据库中的域实体和ID?现在,我有一个带有数据库ID和版本的OfferId类(我使用JPA来保持聚合)。有没有更好的方法?

1 个答案:

答案 0 :(得分:0)

  

现在我有一个具有数据库ID和版本的OfferId类

版本不应该是ID的一部分。该ID必须是不变的。

有几种处理ID生成的策略,但这是常见的策略:

  • 使用GUID可以减轻访问共享数据存储以生成ID的需要。
  • 在存储库上执行nextId(): OfferId操作(实现可以使用数据库序列等):

    Offer offer = new Offer(offerRepo.nextId(), ...);
    
  • 允许Offer类在没有ID的情况下进行实例化,并将您的ORM配置为生成一个。我不确定JPA规范,但似乎在Hibernate中可以结合使用@IdClass@GenerateValue批注,以将数据库生成的标识映射到包装ID类。看看this test case

老实说,我不喜欢将身份分配/生成委托给ORM。如果要从数据库生成ID,我建议使用已描述的第二种方法,即在存储库(或专用服务)上返回一个下一个ID的方法。