使用实体列表@OneToMany时GWT RPC SerializationException

时间:2013-09-29 11:19:09

标签: gwt serialization gwt-rpc

我有2个可序列化的零构造函数实体,与@OneToMany关系(如果我只使用一个没有@OneToMany列表的实体,一切正常):

@Entity
@Table(name = "directory")
public class Directory implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String documentName;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<DirectoryValues> dirValues;

    public Directory() {}
    ...
    getters and setters
    }


@Entity
@Table(name = "directoryvalues")
public class DirectoryValues implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String value;

    public DirectoryValues() {}
    ...
    getters and setters

}

当我添加@OneToMany注释时出现问题:

SEVERE:调度传入的RPC调用时发生异常    com.google.gwt.user.client.rpc.SerializationException:类型'org.hibernate.collection.PersistentBag'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化:在com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)中的instance = []

我的实体名单有什么问题?

2 个答案:

答案 0 :(得分:2)

您必须使用数据传输对象(DTO),阅读:http://www.gwtproject.org/articles/using_gwt_with_hibernate.html,尤其是“为什么Hibernate对象到达浏览器世界时无法理解”部分。或者使用RequestFactory(http://www.gwtproject.org/doc/latest/DevGuideRequestFactory.html)而不是GWT-RPC。

答案 1 :(得分:0)

正如philfr49暗示的那样,GWT和Hibernate有时会遇到一些麻烦。它已被详细记录,您可以阅读他发送的链接中的一些替代方案。您可以避免使用GWT-RPC,避免使用Hibernate,也可以稍微努力使它们兼容。

我有一个GWT和Hibernate一起使用的项目;我使用数据传输对象,并使用Moo翻译和更新域和DTO。有时候这有点痛苦,但我在一定程度上建造了Moo以使这项工作变得更容易。您可以使用其他类似的框架(例如Dozer等)

最终,决定如何最好地解决这个问题是你必须为自己的项目解决的问题。