我有一个关于将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
}
我是否可以使用优雅的模式或方法来促进多种类型对象的此过程。
感谢您的期待
答案 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将按预期工作。如果您还想反序列化对象,则必须首先构造对象,然后在接口中添加设置器。