使用实体列表@OneToMany时发生GWT RPC序列化异常

使用实体列表@OneToMany时发生GWT RPC序列化异常,gwt,serialization,gwt-rpc,Gwt,Serialization,Gwt Rpc,我有两个可序列化的构造函数实体为零,具有@OneToMany关系(如果我只使用一个实体而没有@OneToMany列表,则一切正常): @实体 @表(name=“directory”) 公共类目录实现可序列化{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) 私人长id; 私有字符串名称; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 私有列表值; 公共目录(){} ... 接球手和接球

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

@实体
@表(name=“directory”)
公共类目录实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
私有列表值;
公共目录(){}
...
接球手和接球手
}
@实体
@表(name=“directoryvalues”)
公共类DirectoryValues实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串值;
public DirectoryValues(){}
...
接球手和接球手
}

添加@OneToMany批注时出现问题:

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


实体中的列表有什么问题?

您必须使用数据传输对象(DTO),如下所示:尤其是“为什么Hibernate对象到达浏览器世界时无法理解”部分。或者使用RequestFactory()而不是GWT-RPC。

正如philfr49所暗示的,GWT和Hibernate有时在一起工作时会遇到一些问题。这已经被很好地记录下来了,你可以在他发送的链接中阅读到一些备选方案。您可以避免GWT-RPC、避免Hibernate,或者更努力地使它们兼容

我有一个项目,GWT和Hibernate一起使用;我使用数据传输对象,并使用转换和更新域和DTO。有时候这有点痛苦,但我建立Moo的部分原因是为了让工作更容易。您还可以使用其他类似的框架(如推土机等)


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

我认为,当您有一对多映射时,您应该使用
集。你能试试吗?
@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