【问题标题】:Pattern to map JPA Objects to DTO for Conversion to JSON将 JPA 对象映射到 DTO 以转换为 JSON 的模式
【发布时间】:2014-04-15 01:34:30
【问题描述】:

我有一个关于将 JPA 对象映射到 JSON 字符串的哲学问题。当然,源对象不一定是持久对象——这就是我的情况。

我有一组由 Eclipse Link 管理的对象。我需要将其中一些对象转换为 JSON 字符串,但是映射不是一对一的。我确信转换应该是松耦合的,以便将 JSON 对象与底层实体的更改隔离开来。

我计划拥有这样的 JPA 实体:

@Entity
@Table(name = "AbnormalFlags")
public class AbnormalFlag  implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "Code", unique = false, nullable = false)
    private String code;

    @Column(name = "Description", unique = false, nullable = false)
    private String description;

// Getters and setters

}

以及要转换为 JSON 的等效对象

public class AbnormalFlagDTO  implements java.io.Serializable {

    private String code;
    private String description;
    private Boolean disabled;

// Getters and setters

}

我可以使用一种优雅的模式或方法来促进对几种类型的对象的这个过程吗?

感谢期待

【问题讨论】:

    标签: json design-patterns jpa dto


    【解决方案1】:

    我的回答:不,而且您通常应该谨慎扩展 DTO(在重用现有 DTO 时)。但是您可以使用Map<String, Object> 作为 DTO(如果您不使用相同的 DTO 来读回数据)。此外,您可以创建一个 APT(注释处理器工具),从您的实体生成 DTO 代码,然后您只需修改它们。

    【讨论】:

    • 谢谢你=r cmets。顺便说一句,我发现 ModelMapper 和 Dozer 都可以解决我的问题
    • 感谢您的评论! ModelMapper 绝对比 Map 好,但您可能没有一个好的解决方案来读取数据(例如,当您仅获得 customerId,并且您必须在 DB 中找到它时)。
    【解决方案2】:

    这是Blaze-Persistence Entity Views 的完美用例,因为您很可能还想关注用于获取数据的查询的性能。

    我创建了库以允许在 JPA 模型和自定义接口定义模型之间轻松映射。这个想法是您以您喜欢的方式定义您的目标结构,并通过 JPQL 表达式将属性(getter)映射到实体模型。由于属性名称用作默认映射,因此您通常不需要显式映射,因为 80% 的用例是拥有作为实体模型子集的 DTO。

    您的模型的映射可能如下所示简单

    @EntityView(AbnormalFlag.class)
    interface AbnormalFlagDTO extends Serializable {
      String getCode();
      String getDescription();
      Boolean getDisabled();
    }
    

    查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

    AbnormalFlagDTO dto = entityViewManager.find(entityManager, AbnormalFlagDTO.class, id);

    将实体视图序列化为 JSON 将按预期工作。如果您还想反序列化对象,则必须先构造对象并在接口中添加 setter。

    【讨论】:

    • 感谢您的跟进
    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多