将JPA对象映射到DTO以转换为JSON的模式

时间:2014-04-15 01:34:31

标签: json design-patterns jpa dto

我有一个关于将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

}

我是否可以使用优雅的模式或方法来促进多种类型对象的此过程。

感谢您的期待

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

我创建了该库,以允许在JPA模型和自定义接口定义的模型之间轻松映射。想法是您以自己喜欢的方式定义目标结构,并通过JPQL表达式将属性(获取器)映射到实体模型。由于属性名称用作默认映射,因此大多数情况下您不需要显式映射,因为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将按预期工作。如果您还想反序列化对象,则必须首先构造对象,然后在接口中添加设置器。