假设我有一个没有自然ID的域模型。
class Offer {
ClientId clientId;
CompanyId companyId;
OfferDetails details;
}
通过自动生成的密钥从数据库加载要约。然后将其修改为通过调用业务方法accept
,reject
或renegotiate
。为了坚持报价,我必须具有此自动生成的密钥。如何连接数据库中的域实体和ID?现在,我有一个带有数据库ID和版本的OfferId
类(我使用JPA来保持聚合)。有没有更好的方法?
答案 0 :(得分:0)
现在我有一个具有数据库ID和版本的OfferId类
版本不应该是ID的一部分。该ID必须是不变的。
有几种处理ID生成的策略,但这是常见的策略:
在存储库上执行nextId(): OfferId
操作(实现可以使用数据库序列等):
Offer offer = new Offer(offerRepo.nextId(), ...);
Offer
类在没有ID的情况下进行实例化,并将您的ORM配置为生成一个。我不确定JPA规范,但似乎在Hibernate中可以结合使用@IdClass
和@GenerateValue
批注,以将数据库生成的标识映射到包装ID类。看看this test case。老实说,我不喜欢将身份分配/生成委托给ORM。如果要从数据库生成ID,我建议使用已描述的第二种方法,即在存储库(或专用服务)上返回一个下一个ID的方法。