Java DDD聚合ID和外键

Java DDD聚合ID和外键,java,domain-driven-design,Java,Domain Driven Design,我是DDD的新手。我见过许多示例项目使用通用AggregateId(带有包含GUID的字符串)作为聚合根的键 我想知道如何引用一个孩子在一对一的关系中的聚合词 假设有一个订单聚合oot和一个订单行。在GUID旁边有一个额外生成的(如序列)id是否明智,以便订单行可以在数据库级别引用该id?或者orderLine的外键是否用于订购GUID?是否存在性能影响 例如 BaseAggregateRoot: @MappedSuperclass public abstract class BaseAgg

我是DDD的新手。我见过许多示例项目使用通用AggregateId(带有包含GUID的字符串)作为聚合根的键

我想知道如何引用一个孩子在一对一的关系中的聚合词

假设有一个订单聚合oot和一个订单行。在GUID旁边有一个额外生成的(如序列)id是否明智,以便订单行可以在数据库级别引用该id?或者orderLine的外键是否用于订购GUID?是否存在性能影响

例如

BaseAggregateRoot:

@MappedSuperclass  
public abstract class BaseAggregateRoot {
    @EmbeddedId
    @AttributeOverrides({
       @AttributeOverride
       (name = "idValue", column = @Column(name = "aggregateId", nullable = false))
    })
    protected AggregateId aggregateId;
    ...
订单:

@Entity
public class Order extends BaseAggregateRoot{
    // is this ID necessary?
    @Id
    @GeneratedValue(generator = "OrderSequenceGenerator")
    @SequenceGenerator(name = "OrderSequenceGenerator", sequenceName = "ORD_SEQ1", allocationSize = 1)
    @Column(name = "ord_seq")
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "aggregateId")  <-- should this point to ID or aggregateId?
    private List<OrderLine> orderLines;
@实体
公共类顺序扩展了BaseAggregateRoot{
//这个身份证有必要吗?
@身份证
@GeneratedValue(generator=“OrderSequenceGenerator”)
@SequenceGenerator(name=“OrderSequenceGenerator”,sequenceName=“order_SEQ1”,allocationSize=1)
@列(name=“ord_seq”)
私人长id;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)

@JoinColumn(name=“aggregateId”)首先,我想澄清DDD是关于域建模的,与域的持久化方式无关。它可能会持久化到数据库中,但也可能是文本文件中。从域建模的角度来看,哪一个(以及如何)很重要实体与其他实体相关,但通常与它们在关系数据库中的关系无关。也就是说,询问销售代表。一个订单行项目如何识别其所属的订单,他会问你有什么问题

性能方面,将GUID用作键会带来一些风险。随机生成的GUID不适用于聚集索引。最好使用顺序生成算法,让数据库为您提供这些GUID。以下是有关此主题讨论的链接:

我建议您特别阅读。我同意Dan的观点,即使用顺序GUI没有抓住要点

从关系上讲,对于我来说,为同一条记录使用两个标识符似乎是不必要的,而且通常是不明智的。我建议您选择一个。因此,如果您的项目中一直使用GUID。请查看是否可以通过顺序生成它们来将它们用作键。然后您可以删除
@Id Long Id
。如果没有,请替换
@EmbeddedId
带有
@列
注释

希望这有帮助


祝你好运

他们指的是AggregateRoot,它的标识不是SQL主键!这取决于你如何持久化你的聚合,聚合根可以引用其他聚合。Vernon在实现DDD时将其称为代理ID,并描述为处理RDBMS/ORM需求和限制的完全有效的方法。谢谢,b但我知道。GUID,就像长id一样,不是域模型标识;它也是代理标识,因此我建议。