Я довольно новичок в DDD. Я видел несколько примеров проектов, которые используют общий AggregateId (с String, содержащий GUID) в качестве ключа для совокупного корня.Идентификаторы совокупности DDD и внешние ключи
Мне было интересно, как обращаться к aggregateRoot от ребенка в отношениях OneToMany.
Скажите, что есть заказ AggregateRoot и OrderLine. Было бы разумно иметь дополнительный сгенерированный (например, последовательность) id, рядом с GUID, поэтому OrderLine может ссылаться на это на уровне базы данных? Или внешний ключ 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;
они означают AggregateRoot и это идентичность не SQL первичного ключа! это зависит от того, как вы сохраняете агрегаты, совокупные корни могут иметь ссылку на другие агрегаты. – Ehsan