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

whe*_*ipp 7 java proxy hibernate jpa eclipselink

我来自eclipselink并尝试通过Hibernate自己工作.

让我们假设我们有一个类Car和一个类Wheel.该Car班有n个轮子.两个实体都通过双向关联连接.更重要的是,Wheel我有一个Car参考:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "car_id")
private Car car;
Run Code Online (Sandbox Code Playgroud)

加一个吸气剂.

现在我想用它的id获取一个轮子.从我EntityManager(不是冬眠Session).我初始化EntityManager如下:

EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)

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

Wheel wheel = em.find(Wheel.class, 1);
Run Code Online (Sandbox Code Playgroud)

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

Car car = wheel.getCar();
Run Code Online (Sandbox Code Playgroud)

使用eclipselink,实际的汽车将被加载.使用hibernate代替加载代理类.

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

Hibernate.initalize(car)
Run Code Online (Sandbox Code Playgroud)

我无法检索汽车实体.

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

rgh*_*ome 6

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

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


Vla*_*cea 5

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

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

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

懒惰,返回请求引用时加载的真实对象(此选项必须使用字节码增强,如果类没有增强,则返回PROXY)除非您无法负担代理的使用,否则应避免使用此选项

但您必须使用字节码仪器来激活此选项.