【问题标题】:Hibernate - class level @Where annotation is not enforced on collections of that class?Hibernate - 类级别 @Where 注释未对该类的集合强制执行?
【发布时间】:2011-10-25 16:38:55
【问题描述】:

我在类级别用@Where 属性注释了一个Hibernate 实体。 这限制了当我直接查询时加载哪些实体,但它似乎不适用于该类的集合。这是意料之中的吗?

文档对此并不清楚:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class

where(可选):指定任意 SQL WHERE 条件 检索此类的对象时使用。

在我看来,这似乎适用于检索该类的对象的所有情况,但我观察到这被集合忽略了。

  1. 这是否适用于收藏?
  2. 如果不是,将过滤器全局应用于类的所有实例以及该类的所有集合的最佳方法是什么?

(更新:我提出https://hibernate.atlassian.net/browse/HHH-6781 来跟踪文档问题。)

【问题讨论】:

  • 它似乎应该适用于收藏,但如果它不适用,文档应该明确说明。我提出了hibernate.onjira.com/browse/HHH-6781
  • 我遇到了同样的问题,但是当直接通过 Criteria API 作为createCriteria(MyEntity.class).scroll() 查询一个类时。您在您的案例中使用了哪种方法,HQL 或 Criteria API?
  • 我使用的是标准:list(),而不是 scroll(),但我不希望这会有所作为。

标签: hibernate collections where


【解决方案1】:

在使用“getAll”或“loadAll”时,类级别的@Where 将省略不需要的实例。在类级别拥有@Where 不会“级联”以应用于该实体上的集合。

@Where 在集合属性级别 公共类 PuppySeller {

    @Where(clause = "status='FOR_SALE'")
    public Set<Puppy> getPuppiesForSale() {}

将确保当您从数据库中选择“PuppySeller”时,“puppiesForSale”将仅由具有“FOR_SALE”状态的小狗填充。

但是,要非常谨慎,因为它只适用于第一级集合。我的意思是说你有一只小狗,你想把所有的小狗都卖给同一个卖家。您可能会执行类似“myPuppy.getPuppySeller().getPuppiesForSale()”的操作。但是,如果您这样做,您最终会得到所有属于puppySeller 的小狗,无论其状态如何,包括所有“已售出”或“NEWBORN”等的小狗。

【讨论】:

  • 谢谢。我认为这主要是一个文档错误。尽管有时将行为更改为我所期望的会很有用,但我认为这可能会破坏 BC。我已提出此票以跟踪文档修复:hibernate.atlassian.net/browse/HHH-6781
猜你喜欢
  • 2013-04-15
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多