gpt4 book ai didi

java - 删除主键/id 引用的域实体时确保参照完整性

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:01 24 4
gpt4 key购买 nike

我正在尝试设计我的网络应用程序时考虑到 DDD 实践。此应用程序处理容器在存储位置的存储。一个容器包含一种物质。用户很可能会搜索一种物质并想知道在哪个位置可以找到容器。此外,他们还想清点存储位置,即获取该存储位置的所有容器。

这就是为什么我将 substance、container 和 storageLocation 确定为聚合体。我了解到,不应直接引用其他聚合,而应通过主键引用。现在,我想知道在我的域层中确保引用完整性的最佳方法是什么(即没有指向不存在/错误容器的引用),例如删除容器时,因为 substance 和 storageLocation 引用了容器。假设所有引用都是双向的。我主要害怕“忘记”向可能在项目后期添加的实体添加适当的方法。我不确定这是否是编程时的“有效”问题。

这些是我的实体:

@Entity
public class Substance{
@Id
@GeneratedValue
private Long id;

@ElementCollection
List<Long> ContainerIds;

public void addContainer(Container c){containerIds.add(c.getId())}
public void removeContainer(Container c){// removes c.getId() from list}
}
@Entity
public class Container{
@Id
@GeneratedValue
private Long id; //+get

private Long substanceId; //+ get set
private Long storageLocationId; //+ get set
}
@Entity
public class StorageLocation{
@Id
@GeneratedValue
private Long id;

@ElementCollection
private List<Long> containerIds;

public void addContainer(Container c){containerIds.add(c.getId())}
public void removeContainer(Container c){// removes c.getId() from list}
}

现在,我是我的 Controller ,我必须从存储库中获取 Substance 和 StorageLocation 实体,从中删除容器 ID 引用,然后删除容器:

public class Acontroller{

private ContainerRepository containerRepository; // constructor injected
private SubstanceRepository substanceRepository; // constructor injected
private storageLocRepository storageLocRepository; // constructor injected

public void deleteContainer(Container c){
Substance sub = substanceRepository.getByID(c.getSubstanceId());
sub.removeContainer(c);

//The same for the storageLocation

containerRepository.removeContainer(c);
}
}

每次我向 Container 添加另一个 entityReference 时,我都必须扩展 Controller 方法。

这种“手动”管理引用的方式是否可以接受。如果没有,我将如何在保留 id 引用的同时去做呢?还是我应该忘记 id 而只使用对象引用?


ps:第一个 SO 问题,所以请对我温和一点,让我知道要对这个问题进行哪些更改。

最佳答案

乌迪大汉:Don't Delete -- Just Don't

This app deals with the storage of containers in storage locations. A container contains a substance. Most likely, users will search for a substance and want to know in which location to find the container. Moreover, they will want to inventorize a storage location, i.e. get all containers of that storage location.

This is why I have identified substance, container and storageLocation as aggregates.

所以这是问题#2。聚合的动机是保护您的业务不变性。每个聚合负责验证任何提议的更改。分析查询不会告诉您任何有关变化的信息,因此它不会告诉您任何可以设置边界的信息。

问题 1 是您似乎在为库存建模,而真实世界而不是模型是“记录簿”——您无法通过调用“删除”方法。如果将在线购物车(亚马逊?)的模型与杂货店购物应用程序的模型进行对比,您会发现不同之处:点击删除任意多次,麦片盒不会从您的购物车中跳出。

但是要解决您提出的问题;如果实体 X 必须满足要求实体 Y 存在的不变量,则 X 和 Y 必须是同一聚合的一部分(它可以立即拒绝任何违反不变量的提议更改),或者您必须放宽不变量和允许模型最终调和 X 的状态与不再可用的 Y 之间的冲突。

关于java - 删除主键/id 引用的域实体时确保参照完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39515389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com