Java DDD聚合ID和外键
我是DDD的新手。我见过许多示例项目使用通用AggregateId(带有包含GUID的字符串)作为聚合根的键 我想知道如何引用一个孩子在一对一的关系中的聚合词 假设有一个订单聚合oot和一个订单行。在GUID旁边有一个额外生成的(如序列)id是否明智,以便订单行可以在数据库级别引用该id?或者orderLine的外键是否用于订购GUID?是否存在性能影响 例如 BaseAggregateRoot: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
@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一样,不是域模型标识;它也是代理标识,因此我建议。