【问题标题】:Hibernate - Manipulating collection post loadHibernate - 操作收集后加载
【发布时间】:2017-07-01 18:40:24
【问题描述】:

我们正在尝试根据其包含的对象过滤\操作持久性集合(过滤掉特定条目)。

由于此操作将在包含不同集合的大量不同对象上执行,因此它必须尽可能通用。 在 HQL\SQL 级别过滤不是一个选项,因为它无法维护。这意味着它必须在集合加载和初始化之后执行。 我们目前正在使用许多 Hibernate 事件来处理单个对象, 所以我们尝试收听InitializeCollectionEvent。 但事实证明,我们的大多数集合都是使用 HQL Fetch 初始化的,因此不会为它们引发此事件。

还有其他我们可以使用的 Hibernate 事件吗?

在加载集合后处理集合的任何其他地方?

我们使用的是 Hibernate 4.1.7。

【问题讨论】:

    标签: java hibernate events collections event-listener


    【解决方案1】:

    我认为在加载集合时在服务器端过滤集合不是一个好主意。如果您这样做,则意味着 smth 出错了,请重新考虑您的数据库模型或实体结构。过滤集合的最佳方法之一 - 使用 HQL。或者你可以使用 @Where 或@Loader,@Filter。

    【讨论】:

    • 在一个完美的世界里,我会同意你的观点,但在这种情况下,更改模型\数据库不是一种选择,因为这是一个庞大而复杂的生产系统,影响太大且风险太大。正如我上面提到的,可以通过 HQL 和 Hibernate 注释进行过滤,如您所建议的,但以后很难维护。理想情况下,操作应该在加载阶段执行,使用事件或 Loader 类。
    • 好的,你试过@PostLoad吗???我不确定,但你可以试试。而且我建议在 org.hibernate.Interceptor 中尝试一下,只需创建自己的实现,很容易 google,Interceptor 是一个非常强大的类。
    • 拦截器可以处理收集,但它们不会被初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多