java - 隐藏删除的对象

标签 java hibernate jpa

我有以下用例:有一个名为 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/

相关文章:

java - GWT:ListEditor 错误地尝试验证从列表中删除的实体

java - SafeHtml Bean 验证,允许 HTML 元素属性,同时拒绝可能的恶意标签(即 <script>...)

mysql - Eclipse JPA (MySQL) 自动生成位字段到字节,我可以让它生成位到 bool 值吗

java - 条件 API 组合 AND/OR

java - 从迭代中返回值列表

java - 为什么我仍然可以更改这个最终变量?

java - 限制对Spring的依赖而不失去框架的力量

java - 带有参数 NoSuchMethodError 的 HQL

java - java swing 中的 Hibernate 和库 sql cp30

java - 为什么这个@JsonIgnore 修复了我的无限循环?