我有以下用例:有一个名为 Template 的类,使用该类我可以创建 ActualObject 类的实例(ActualObject 从 Template 复制其初始数据)。 Template 类有一个 Product:s 列表。
现在到了棘手的部分,用户应该能够从数据库中删除产品,但这些删除可能不会影响模板的内容。换句话说,即使产品被删除,模板仍然应该可以访问它。这可以通过向产品添加“已删除”标志来解决。如果一个 Product 被删除,则可能不会从数据库中显式搜索它,但可以隐式获取它(例如通过 Template 类中的引用)。
这背后的想法是,当从模板创建 ActualObject 时,会在用户界面中通知用户“模板 X 有一个带有参数 A、B 和 C 的产品 Z,但该产品已被删除并且不能在 ActualObject Z 中这样添加。
我的问题是我应该如何将这些已删除的对象标记为已删除。在有人建议只更新删除标志而不是执行实际的删除查询之前,我的问题并不是那么简单。删除标志及其行为应该存在于所有 POJO 中,而不仅仅是产品中。这意味着我会遇到级联问题。例如,如果我删除了一个模板,那么产品也应该被删除,每个产品都有一个价格对象的引用也应该被删除,每个价格可能有一个增值税对象的引用等等。所有这些级联对象都应标记为已删除。
我的问题是如何以合理的方式完成此操作。遍历每个对象(正在删除)检查每个字段以查找应删除的引用,遍历它们的引用等非常费力,并且很容易出现错误。
我正在使用 Hibernate,我想知道 Hibernate 是否具有任何此类内置功能。我想到的另一个想法是使用 hibernate 拦截器将实际的 SQL 删除查询修改为更新查询(我什至不能 100% 确定这是可能的)。我唯一担心的是 Hibernate 是否依赖外键中的级联,换句话说,级联删除是由数据库而不是 Hibernate 完成的。
最佳答案
My problem is how I should mark these deleted objects as deleted.
我认为您选择了一种非常复杂的方法来解决任务。引入 ProductTemplate
会更容易。将您需要的所有必需属性放入该对象中。您还需要在这里引用一个 Product
实例。除了标记 Product
,您还可以删除它(并删除所有其他实体,例如价格)。当然,您应该清除 ProductTemplate
中的引用。当您创建 ActualObject
的实例时,您将能够通过适当的消息通知用户。
关于java - 隐藏删除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305030/