1

我关注了 https://developers.google.com/web-toolkit/articles/mvp-architecture。在他们的模型中,他们使用一个类“Contact”和一个名为“ContactDetails”的类的轻量级版本。因为我真的不需要精简版,所以我删除了 ContactDetails 并将其替换为 Contact。

现在我遇到了例外

Type 'org.eclipse.persistence.indirection.IndirectList' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = {IndirectList: not instantiated}

原因是,正如我在这里发现的 (http://stackoverflow.com/a/6778986/1141785),Contact 类是一个使用 Persistence API 技术的类,它不应该被发送到网络上。

那么 ContactDetails 类是我应该通过线路发送的 DTO 类吗?有没有办法避免使用这个额外的类?

我想避免使用“轻”版本的原因是,我想使用 FieldUpdater 在 DataGrid 中编辑 Contact 类。

当我使用 DTO 类时,我有什么优势吗?

我怎样才能避免我在 Contact 和 ContactDetails 类中有这么多重复的代码,而它们应该几乎是名字?

4

2 回答 2

1

使用 JPA 时,您可以拥有一个包含 List 的类,例如:

public class Contact implements IsSerializable {
    // ...
    private List<Address> addresses;
    // ...
}

但是在创建联系人时,地址被设置为 IndirectList 的一个实例。这允许从数据库中延迟加载集合,但在客户端上不起作用。在将其发送给客户端之前,您需要将其替换为 ArrayList 之类的东西。您可以将其设置为空列表,或将内容复制到新列表。

如果列表的元素本身包含集合,那么您也需要替换这些集合。您需要小心循环引用和从数据库中提取太多项目。

于 2012-08-25T14:47:52.903 回答
0

只需使用 fetchtype eager 注释您的列表。

public class Contact implements IsSerializable {

    @ElementCollection(fetch = FetchType.EAGER)
    private List<Address> addresses;

}
于 2016-09-08T09:11:50.093 回答