【问题标题】:Using a selective @Entity使用选择性@Entity
【发布时间】:2012-04-27 19:15:59
【问题描述】:

我已经搜索 StackOverflow 有一段时间了,但到目前为止还没有成功。 因此创建了这个问题......

我目前正在使用 JPA,但遇到了一个问题(至少对我来说是这样)。情况如下: 我创建了一个系统,可以在其中删除用户,但不能从数据库中删除(为了保持这个特定用户的订单)。为此,我只是向实体用户添加了一个布尔值。到目前为止一切都很好,但棘手的部分来了。由于系统的使用不需要任何“已删除”的用户,我不想从数据库中检索它们。

有没有办法在@Entity 注释中添加某种声明?或者在这种情况下我根本不应该使用@Entity?

提前感谢您的帮助!

PS。我不是在寻找必须创建某种 User_OLD 表的解决方案。

【问题讨论】:

  • 您使用哪种 JPA 实现?
  • 不太明白...为什么不能只选择已删除标志 = 0 的用户??这是一个简单的 db 字段,在 @Entity 用户中映射为布尔属性,您可以使用此属性过滤项目...
  • 好吧 perissf,我正在寻找使用注释的解决方案,但似乎不可能。我现在确实在尝试添加这个 WHERE 子句,但是正如我在 Melnik 的回答中所说的那样,我不确定我的解决方案是否正确。
  • @axtavt,我正在使用 Eclipselink

标签: java jpa entity


【解决方案1】:

首先,我建议将列“removed”重命名为“inactive”,因为您不会删除用户。

对于检索实体,这里有两种选择:

  • 根据非活动 == false 在数据库中创建 USER_ACTIVE VIEW 和 更改您的 @Entity 以使用 USER_ACTIVE 视图。
  • 在从 USER 表中检索时添加 WHERE inactive == false 子句。

如果你有实体,它包含用户集合,并用@FetchType.LAZY 注释:

  • 在需要时使用与上述相同的 where 子句获取用户。

【讨论】:

  • 我正在尝试添加一个 WHERE 子句,这没问题。不过,我只是设法将此 WHERE 子句添加到方法 findAll() 中。这仍然意味着 JPA 会默认获取所有用户,或者不是,由于延迟加载?只编辑这个方法就够了吗?
  • 如果您的 findAll() 方法(如果您只检索活动用户,则为 findActive())在检索时使用 where 子句查询实体,那么没问题。 LazyLoading 是什么意思?
  • 好吧,我的问题是,JPA 是否仍会检索此方法之外的所有用户(默认情况下),还是仅由此方法触发此事件?因此我提出了延迟加载,但我很确定这些用户只有在实际访问时才会被检索到?
猜你喜欢
  • 2015-11-23
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多