1

我有一个使用 Hibernate 映射到表的简单 POJO。哪个工作得很好。

public class Patient implements Serializable {

    private int    patientId;
    private String firstName;
    private String lastName;
    private Set<Prescription> patientPrescriptions;

    public Patient() {}

    ...
}

我的问题是我希望能够序列化该对象,这样我就可以通过我的 GWT-RPC 调用来获取它。如果我的异步服务返回此对象,我会收到错误消息:

com.google.gwt.user.client.rpc.SerializationException:类型“org.hibernate.collection.PersistentSet”未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全目的,此类型不会被序列化。

我想这是因为它不能序列化Set因为这是一个接口因此不可序列化。另一方面,Hibernate 需要一个集合接口(Set/Map)才能工作。所以这意味着我不能再发送使用 Hibernate 映射的对象?是否有一些“简单”的方法来序列化 Set?

谢谢你。

4

2 回答 2

2

只是添加有关我如何克服此序列化问题的详细信息:

1- 我有 2 个数据模型对象(这很糟糕,但我没有时间让学校项目清理它)。

// The persistent data model class
public class PatientPersistent implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

// The serializable over the wire (GWT-RPC) data model class
public class Patient implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

2- 我使用 Dozer 将持久模型 <== 映射到 ==> 可序列化数据类 Patient。像这样:

Patient thePatient = mapper.map(persistentObject, Patient.class);

这个病人由我的异步服务发回给客户端。在此映射之后,您可以看到 Patient 具有来自 java.util 的 HashSet<> 类型,而不是休眠的不可序列化版本。

于 2010-07-19T20:04:41.033 回答
1

问题是 GWT 没有找到注解和使用的类的源代码。GWT 需要该源代码,因为它必须将您的对象编译成 JS。

我希望能够序列化该对象,这样我就可以通过我的 GWT-RPC 调用来获取它。

你可以使用吉利德来做到这一点。(以前称为 Hibernate4GWT)

我想这是因为它不能序列化 Set 因为这是一个接口因此不可序列化。另一方面,Hibernate 需要一个集合接口(Set/Map)才能工作。所以这意味着我不能再发送使用 Hibernate 映射的对象?是否有一些“简单”的方法来序列化 Set?

问题不在于Set,GWT 可以通过其 GWT-RPC 很好地序列化集合。尽管在传输过程中,您将希望使用特定的实现,例如HashSet允许它针对该特定实现进行优化,而不是使用通用接口。

于 2010-07-19T16:04:43.307 回答