【发布时间】:2015-04-14 06:31:15
【问题描述】:
我来自 eclipselink,并尝试通过 Hibernate 工作。
假设我们有一个类Car 和一个类Wheel。 Car 类有 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 对象。在休眠中,我似乎只取回了一个代理对象(即使执行了一个查询,正如我在记录器中看到的那样)。问题是如何在不使关系急切或首先执行获取之后取回真实对象。希望这会有所帮助。
-
因为我需要真实的汽车对象而不是代理。我在调试器中检查了对象...它绝对是一个代理:)。
-
为什么需要实物?你想做什么需要对象而不是代理?
-
让我们假设这辆车有一个名字,我想获得汽车的真实名称。使用代理我会得到空值。
标签: java hibernate jpa proxy eclipselink