使用JPA进行DTO转换的实体

时间:2010-02-15 15:26:50

标签: jpa lazy-loading dto datanucleus

我正在使用DataNucleus作为JPA实现来将我的类存储在我的Web应用程序中。我使用了一组转换器,它们都有toDTO()fromDTO()

我的问题是,我想避免整个数据库通过网络发送:

  • 如果我延迟加载,转换器将尝试访问所有字段,然后加载(导致非常急切的加载)。
  • 如果我没有延迟加载,我将获得数据库的很大一部分,因为用户包含组,组包含用户,等等。

有没有办法在我加载的类中显式加载某些字段并将其他字段保留为NULL? 我没有运气就尝试过DataNucleus文档。

2 个答案:

答案 0 :(得分:3)

你的DTO可能太精细了。即不打算每个JPA实体拥有一个DTO。如果你必须使用DTO,那么让它们更粗糙并手动构建它们。

最近我们已经把整个“转到DTO或不转到DTO,这就是问题”再次讨论。对它们的要求(特别是在JPA应用程序的上下文中)通常不再存在,但FOR DTO的一个论点往往是视图具有较粗糙的数据要求。

答案 1 :(得分:0)

要仅加载您真正需要的数据,您将需要使用一个定制的select子句,其中仅包含您将用于DTO的这些元素。我知道这是多么痛苦,尤其是在涉及联接时,这就是为什么我创建Blaze-Persistence Entity Views的原因,该工作将使查询高效。

您将DTO定义为具有到实体的映射的接口,使用属性名称作为默认映射,这看起来非常简单,并且很像实体的子集,尽管不是必须的。您可以使用任何JPQL表达式作为DTO属性的映射。