【问题标题】:How to load the actual Hibernate entity association and not the LAZY proxy如何加载实际的 Hibernate 实体关联而不是 LAZY 代理
【发布时间】:2015-04-14 06:31:15
【问题描述】:

我来自 eclipselink,并尝试通过 Hibernate 工作。

假设我们有一个类Car 和一个类WheelCar 类有 n 个轮子。两个实体都通过双向关联连接。更重要的是在Wheel 方面我有一个Car 参考:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "car_id")
private Car car;

加上一个吸气剂。

现在我想使用它的 id 来获取一个轮子。来自我的EntityManager(不是休眠Session)。我像这样初始化EntityManager

EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = emf.createEntityManager();

下一步是获取这样的轮子:

Wheel wheel = em.find(Wheel.class, 1);

轮子返回想要的类和它的罚款。现在我想知道哪辆车是车轮的父级,例如:

Car car = wheel.getCar();

使用 eclipselink,实际的汽车会被加载。使用休眠代替加载代理类。

目前我想出的唯一解决方案是设置 FetchType.EAGER 或直接 fetch join 关系。我意识到的是,Hibernate 中的 SQL 语句仍在执行,但没有传递真正的对象。也是在

之后
Hibernate.initalize(car)

我无法检索汽车实体。

有没有办法在不形成查询或急切获取的情况下取回预期的对象?

【问题讨论】:

  • 是的。当轮子被检索到时,我从数据库中取回了一个合适的对象。在下一步中,我执行了 wheel.getCar();。在 eclipselink 中,汽车立即加载(执行查询),我得到了一个真正的 Car 对象。在休眠中,我似乎只取回了一个代理对象(即使执行了一个查询,正如我在记录器中看到的那样)。问题是如何在不使关系急切或首先执行获取之后取回真实对象。希望这会有所帮助。
  • 因为我需要真实的汽车对象而不是代理。我在调试器中检查了对象...它绝对是一个代理:)。
  • 为什么需要实物?你想做什么需要对象而不是代理?
  • 让我们假设这辆车有一个名字,我想获得汽车的真实名称。使用代理我会得到空值。
  • 我认为它不应该返回 null,但也许我遗漏了一些东西。请参阅这篇文章:link 和这篇文章:link

标签: java hibernate jpa proxy eclipselink


【解决方案1】:

您可能不需要担心代理。代理应该以与普通对象相同的方式返回所有属性。

如果代理对象不工作(它返回空值),可能是您的某些字段或 setter 或 getter 设置为 final。先检查一下。

【讨论】:

    【解决方案2】:

    你需要使用Hibernate特定的LazyToOneOption.NO_PROXY注解:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "car_id")
    @LazyToOne(LazyToOneOption.NO_PROXY)
    private Car car;
    

    这将指示 Hibernate 加载实际对象,而不是为您提供代理:

    懒惰,将请求引用时加载的真实对象返回 (此选项强制执行字节码增强,回退到 PROXY 如果该类未增强)应避免使用此选项,除非您 负担不起使用代理的费用

    但您必须使用字节码检测来激活此选项。

    【讨论】:

    • 目前无法测试。当我调用 wheel.getCar(); 时,这会在运行时按需加载我的真实对象吗?
    • 另一个答案更好。仍然会给你一个赞成票。欢呼
    • 谢谢。确实,您不必为此担心太多。
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多