如何加载实际的Hibernate实体关联而不是LAZY代理

时间:2015-02-13 09:00:57

标签: java hibernate jpa proxy eclipselink

我来自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,实际的汽车将被加载。使用hibernate代替加载代理类。

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

之后
Hibernate.initalize(car)

我无法检索汽车实体。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

您需要使用特定于Hibernate的LazyToOneOption.NO_PROXY注释:

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

这将指示Hibernate加载实际对象,而不是给你一个代理:

  

懒惰,返回请求引用时加载的真实对象   (此选项必须使用字节码增强功能,再回到PROXY   如果没有增强课程,除非你,否则应避免使用此选项   无法承担代理的使用

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