我有延迟加载集合的DTO类。让我们说作者和书籍。客户端是GWT。 因此用户必须选择作者,然后他应该看到书籍列表。因此,在选择作者之前,我不想转移作者书籍。 所以流程是:
我看到3个选项:
getAllAuthorsWhitoutBooks()
这样的方法,而不是在那里复制图书)AuthorWhithoutBooks
并将其用于首次转移Set
子类NotLoadedSet
(并在任何操作中抛出一些异常)并创建getAllAuthorsWhitoutBooks()
mehtod。所以thansfered对象将包含NotLoadedSet
个实例而不是真实的书籍。是否有针对此案例或常用方法的特定配方?
答案 0 :(得分:0)
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作为“大”查询。命名查询也可以,但我喜欢标准。
希望这有帮助。