代码之家  ›  专栏  ›  技术社区  ›  WhyNotHugo

实体到DTO与JPA的转换

  •  6
  • WhyNotHugo  · 技术社区  · 16 年前

    我使用DataNucleus作为JPA实现,将类存储在Web应用程序中。我使用一组转换器 toDTO() fromDTO() .

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

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

    有没有一种方法可以显式地加载一些字段,并在我加载的类中将其他字段保留为空? 我试过DataNucleus文档,但运气不好。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Craig Day    16 年前

    您的DTO可能太细了。也就是说,不打算为每个JPA实体设置DTO。如果必须使用DTO,则使其更粗粒度,并手动构造它们。

    最近我们又进行了“对DTO还是不对DTO,这就是问题”的讨论。对它们的需求(尤其是在JPA应用程序的上下文中)通常不再存在,但DTO的一个论点往往是视图具有更粗的数据需求。

        2
  •  0
  •   Christian Beikov    7 年前

    要只加载您真正需要的数据,您需要使用一个自定义select子句,该子句只包含将用于DTO的这些元素。我知道这有多痛苦,尤其是当它涉及到连接时,这就是我创建的原因 Blaze-Persistence Entity Views 这将有助于提高查询效率。

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