延迟加载集合+ GWT

时间:2014-01-03 16:42:57

标签: hibernate gwt design-patterns lazy-loading

我有延迟加载集合的DTO类。让我们说作者和书籍。客户端是GWT。 因此用户必须选择作者,然后他应该看到书籍列表。因此,在选择作者之前,我不想转移作者书籍。 所以流程是:

  1. 将没有书籍的所有作者加载到客户
  2. 用户选择作者
  3. 加载此作者的书籍
  4. 我看到3个选项:

    • 转移到客户端时,不要首次将图书复制到作者对象(即创建像getAllAuthorsWhitoutBooks()这样的方法,而不是在那里复制图书)
    • 创建特殊班级AuthorWhithoutBooks并将其用于首次转移
    • 创建Set子类NotLoadedSet(并在任何操作中抛出一些异常)并创建getAllAuthorsWhitoutBooks() mehtod。所以thansfered对象将包含NotLoadedSet个实例而不是真实的书籍。

    是否有针对此案例或常用方法的特定配方?

2 个答案:

答案 0 :(得分:0)

用piber似乎很简单,当然你会懒得加载书籍集。

class Author{
@OneToMany(lazy=true)
private List<Book> books;

}

当用户第一次要求作者时,很明显这里不会加载书籍。

当用户为AuthorID = 1的作者要求书籍时,(将此发送到服务层中的另一个方法说'getAuthorWithBooks'),然后在服务/经理中执行以下操作

Author author = session.findById(AuthorID);
author.getBooks(); 

上述声明现在将加载作者的所有书籍。如果书没有加载, 尝试使用Hibernate.initialize(author.getBooks())

答案 1 :(得分:0)

我尽量避免来回发送无用的数据,并尽可能简单快速地查询。

1°使用命名查询或条件投影来仅获取所需(作者withoud书籍)数据。

2°获取一套书籍(没有作者)而不是AuthorWithBooks,因为你已经有了作者。

3°使用转换器映射实体字段的子集(仅需要一个,在需要时转换)并将实体与客户端代码分离。

阅读上述答案&amp;评论,我会尝试提供一些进一步的建议&amp;技巧。

Zeus建议解耦实体和共享对象是正确的。

这种解耦对于面向数据的服务来说是一种痛苦。如果您正在撰写此类服务,可能需要查看RequestFactory。在大多数情况下,我坚持通过编写转换器来解耦共享对象和实体。我经常不希望将整个实体映射到共享对象“原样”,并且可能希望转换一些字段以使共享对象更容易在客户端代码中使用。

注意您也可以使用Dozer进行转换,但我听说它有点慢。

@ xander27提防

  

“让我们想象一段时间后其他开发人员会使用它   由于某种原因而期待的方法......“

@zeus你的解决方案是正确的,但我不同意按照惯例'

创建null的对象
  

“如果你包含[书籍],它将/应该为空”

也许你认为这是隐含的,但我仍然会这么说。如果您想拥有一个Author和一个AuthorWithBook类,请使用继承并使AuthorWithBooks扩展Author。使用继承比使用null更好。如果程序员需要其他数据,他们应该扩展基类(或者根据系统需要更好地重构层次结构,并避免它变得臃肿)。继续思考OO。

使用Hibernate,我经常使用条件投影来加载实体的部分字段,而不是@OneToMany(lazy=true)。这使我的查询更快,而我可以在加载所有实体树时使用简单的getById作为“大”查询。命名查询也可以,但我喜欢标准。

希望这有帮助。