避免使用DTO课程?

时间:2012-08-25 12:34:42

标签: gwt datagrid jpa-2.0 dto

我跟着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类应该通过线路发送吗? 有没有办法避免使用这个额外的课程?

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

使用DTO课程时,我的情况有什么好处吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

但是当创建Contact时,地址被设置为IndirectList的实例。这允许从数据库延迟加载集合,但不能在客户端上运行。在将其发送到客户端之前,您需要将其替换为类似ArrayList的内容。您可以将其设置为空列表,或将内容复制到新列表。

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

答案 1 :(得分:0)

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

public class Contact implements IsSerializable {

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

}