在Hibernate期间Session
,我正在加载一些对象,并且由于延迟加载,其中一些被加载为代理.一切都好,我不想把懒人装完.
但后来我需要通过RPC将一些对象(实际上是一个对象)发送到GWT客户端.碰巧这个具体对象是代理.所以我需要把它变成一个真实的对象.我在Hibernate中找不到类似"实现"的方法.
如何知道他们的类和ID,将一些对象从代理转换为实际?
目前,我看到的唯一解决方案是从Hibernate的缓存中驱逐该对象并重新加载它,但由于许多原因它真的很糟糕.
我来自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)
我无法检索汽车实体.
有没有办法在不形成查询或急切获取的情况下获得预期的对象?