用于GWT RPC的可序列化Hibernate数据对象

时间:2010-07-19 16:01:25

标签: hibernate gwt rpc serializable

我有一个使用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对象。出于安全考虑,此类型不会被序列化。

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

谢谢。

2 个答案:

答案 0 :(得分: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将持久模型&lt; ==映射到==&gt;可序列化数据类患者。像这样:

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

我的Async服务将该患者发送回客户端。在该映射之后,您可以看到患者具有HashSet&lt;&gt;从java.util输入而不是hibernate非可序列化版本。

答案 1 :(得分:1)

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

  

我希望能够序列化   对象,所以我可以通过电线   我的GWT-RPC电话。

您可以使用Gilead来执行此操作。 (以前称为Hibernate4GWT)

  

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

问题不在Set,GWT可以通过GWT-RPC很好地序列化集合。虽然在传输过程中您需要使用HashSet之类的特定实现来允许它针对该特定实现进行优化,而不是通用接口。