gpt4 book ai didi

java - GWT 中的 Hibernate 序列化异常但 Eclipselink 中没有

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:35:19 25 4
gpt4 key购买 nike

我在表示层上使用带有 GWT 2.0 框架的 eclipselink JPA 实现(实体)。一切正常。但是当我将我的 JPA 实现更改为 Hibernate 时,当我传递实体 bean 时,我在 GWT 层上得到序列化/反序列化异常,但在 eclipselink JPA 上没问题。到底发生了什么? Hibernate 也是 JPA 和 eclipselink 的实现,为什么它们的行为不同?

我应该怎么做才能解决 Hibernate 上的这个异常?使用 Hibernate4gwt?

哪种 JPA 实现更适合 GWT?

问候

最佳答案

我建议阅读全文 Using GWT with Hibernate论文,它很好地解释了为什么增强类(无论您使用的是代理 还是 编织)对于 GWT 是“有问题的”:

Why Hibernate objects can't be understood when they reach the browser world

...

When you take an object and turn it into a Hibernate object, the object is now enhanced to be persistent. That persistence does not come without some type of instrumentation of the object. In the case of Hibernate, the Javassist library actually replaces and rewrites the bytecode for these objects by persistent entities to make the Hibernate magic work. What this means for GWT RPC is that by the time the object is ready to be transferred over the wire, it actually isn't the same object that the compiler thought was going to be transferred, so when trying to deserialize, the GWT RPC mechanism no longer knows what the type is and refuses to deserialize it.

In fact, if you were to look deeper to the earlier call to loadAccounts(), and step into the RPC.invokeAndEncodeResponse() method, you would see that the object we're trying to deserialize has now become an ArrayList of Account types with their java.util.Set of records replaced by the org.hibernate.collection.PersistentSet type.

Similar problems arise with other persistence frameworks, such as JDO or JPA, used on Google App Engine.

...

据我所知,这不是 Hibernate 特有的问题,您可能还会遇到其他 JPA 实现的问题,包括 EclipseLink if you use static or dynamic weaving (您不会被迫使用编织,但您会错过延迟加载或获取组等功能)。

本文提出了几种可以解决问题的集成策略:

  • 使用数据传输对象(啊!)
  • 使用 Dozer用于 Hibernate 集成(先前方法的改进版本)
  • 使用 Gilead (以前称为 Hibernate4Gwt)用于 Hibernate 集成

它还讨论了它们的优缺点,请查看。

总结一下...

首先,我认为 GWT 没有“最佳”JPA 实现,它们都面临着同样的问题。如果您可以在没有延迟加载的情况下生活,没有编织的 EclipseLink 可能会更简单。但是你会以某种方式把头埋在沙子里,问题在那里,你将无法使用其他实现。

其次,虽然前两个“集成策略”适用于任何 JPA 提供程序,但 Hibernate 是 Gilead 目前支持的唯一 JPA 实现(但 OpenJPA and EclipseLink supports is planned)。

选择你的毒药:)

另见

关于java - GWT 中的 Hibernate 序列化异常但 Eclipselink 中没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3397475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com