- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试设计我的网络应用程序时考虑到 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/
使用此类和映射: Public class Something { public int Id; public IList Similarthings { get; set; } }
我在Rails 3.2.2中,并且有一个Variant类: class Variant v2 v2.twin_variant => v1 这可能吗?我应该如何建立协会? 最佳答案 给定以下模型 cl
我计划建立一个新的SNS web应用程序,具有以下/跟随功能。我正在考虑使用Ruby on Rails+MySQL,但是我发现如果我使用它们,就需要在一些常用的特性上使用连接查询,比如显示您正在跟踪的
我正在尝试在 SQLAlchemy 中创建一个类似于多对多映射的社交网络。也就是说,我有一个 Character 类和一个 character_relations 交叉表来链接 Character 到
我是一名优秀的程序员,十分优秀!