当前位置: 首页 > 知识库问答 >
问题:

JPA中是否有可能对子对象被延迟加载做出反应?

茹正初
2023-03-14

我知道@PostLoad,但必须将其添加到延迟加载的子对象中。是否有任何注释或钩子方法会导致在子级延迟加载后调用父级上下文中的方法?我面临的问题是,孩子不知道家长,但我需要在加载后将家长知道的一些数据传递给每个孩子,而不会丢失延迟加载。如果不在普通JPA中,那么Eclipselink中是否存在这样的选项?

共有1个答案

束俊英
2023-03-14

在vanilla JPA中,没有内置选项可以在延迟加载子级后在父级上下文中调用方法。但是,一些JPA提供程序,例如Eclipse Link,提供了可以帮助您实现目标的附加功能

在Eclipse Link中,您可以使用DescriptorEventListener接口来监听JPA生命周期中的各种事件,包括postLoad事件。您可以将实现DescriptorEventListener接口的类的实例注册到JPA提供程序的Session或EntityManager以接收这些事件。

下面是一个如何使用DescriptorEventListener实现目标的示例:

定义一个实现DescriptorEventListener接口并包含对父对象的引用的事件侦听器类:

public class MyEventListener implements DescriptorEventListener {
    private MyParentEntity parent;

    public MyEventListener(MyParentEntity parent) {
        this.parent = parent;
    }

    @Override
    public void postLoad(DescriptorEvent event) {
        // Check if the loaded entity is a child entity of the parent
        if (event.getSource() instanceof MyChildEntity && parent.equals(((MyChildEntity) event.getSource()).getParent())) {
            // Pass data from the parent to the child
            ((MyChildEntity) event.getSource()).setData(parent.getData());
        }
    }

    // Other methods of the DescriptorEventListener interface
}

向实体管理器注册事件侦听器:

entityManager.unwrap(JpaEntityManager.class).getActiveSession().getEventManager().addListener(new MyEventListener(parent));

在本例中,parent是要传递数据的父对象。在延迟加载子实体之后,调用事件侦听器的postLoad方法。事件侦听器检查加载的实体是否是父实体的子实体,如果是,则将数据从父实体传递给子实体。

请注意,此解决方案特定于Eclipse Link,可能不适用于其他JPA提供程序。

 类似资料:
  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 我想避免急切的抓取。如何实现这段代码,这样我就可以随机获取User,它是UserGroup的一部分,它是DocumentType对象中SubmissionUserGroups的一部分。

  • 问题内容: 我已使用批注将其用于获取计算的属性。我需要的是那些用注解注解的字段/获取器应延迟加载。 这甚至有可能吗? 谢谢 问题答案: 是的。只需使用@Basic(fetch = FetchType.LAZY) 注释属性的字段/ 获取器,然后使用hibernate提供的此ant任务即可为实体类进行字节码检测。否则,将默默忽略该属性的LAZY加载。 该文档包含有关如何使用此ant任务进行字节码检测的

  • 我面临的问题是一对一的惰性加载在Hibernate中不起作用。我已经解决了,但还是不明白会发生什么。 我的代码(懒惰加载在这里不起作用,当我拉person-address也被提取): 但是:如果我在OneToOne关系中添加,那么惰性加载工作很好! 问题/恳求:请给我解释一下注释如何帮助实现延迟加载。 附注。我看过post1和post2,明白了为什么简单的OneToOne不能偷懒,但我还是不能掌握

  • 看了几个网页后,我仍然不明白为什么我的@ElementCollection会急切地加载。我的理解是,默认情况下任何@ElementCollection都应该总是懒洋洋地加载。正如您所看到的,情况并非如此--您将在本文末尾看到控制台的输出。我试图使用@ElementCollection(fetch=fetchType.lazy)注释强制执行惰性加载,但这并没有改变任何事情。有没有人可以解释一下,也可

  • 1、mybatis 是否支持延迟加载? 延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。 延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。 mybatis仅支持关联对象association和关联集合对象collection的延迟加载,association是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazylo

  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取某些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list

  • 问题内容: 我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。 我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取): 但是 :如果我添加 OneToOne关系,则延迟加载 效果很好 ! 问题/完整性: 请向我解释注释如何帮助实现延迟加载。 PS 我已经阅读了post1和post2的帖子,并了解了为