java - Hibernate - 实体到 JSON
问题描述
我需要将具有 JsonManagedReference 和 JsonBackReference 实现的实体转换为 json:
@Entity
@Table(name = "myparenttable", schema = "myschema", catalog = "mydb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Parent implements Serializable {
private Integer id_parent;
private String name;
@JsonManagedReference
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<Child> children;
//getters and setters
}
@Entity
@Table(name = "mychildtable", schema = "myschema", catalog = "mydb")
public class Child implements Serializable {
private Integer id_child;
private String description;
@JsonBackReference
private Parent parent;
//getters and setters
}
有了这个设置,persist 函数就很简单了,我只需执行一个
em.persist(父);
并且两个实体都被插入到数据库中;但我还需要将这些实体转换为 json 用于审计目的。执行此操作时出现无限递归错误:
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(parent);
有没有办法做到这两点?
解决方案
这是将 DTO 与Blaze-Persistence Entity Views一起使用的完美用例。
我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您以您喜欢的方式定义您的目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。
使用 Blaze-Persistence Entity-Views 的用例的 DTO 模型可能如下所示:
@EntityView(Parent.class)
public interface ParentDto {
@IdMapping
Integer getId();
String getName();
List<ChildDto> getChildren();
@EntityView(Child.class)
interface ChildDto {
@IdMapping
Integer getId();
String getDescription();
}
}
查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。
ParentDto a = entityViewManager.find(entityManager, ParentDto.class, id);
Spring Data 集成允许您几乎像 Spring Data Projections 一样使用它:https ://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
除了解决您的序列化问题之外,使用 Blaze-Persistence Entity-Views 还可以提高性能,因为它只选择实际需要的列。
推荐阅读
- python - 为什么 python 不能从我创建的模块中导入一个简单的函数?
- amazon-web-services - 如何为 API Gateway RestAPI 禁用区分大小写的路径段
- html - 如何将一个标签与另一个多行标签对齐?
- python - 谷歌趋势分类搜索
- java - 将迭代器的迭代器转换为列表?
- python-3.x - 提高读取多个大文件的性能
- github - Github Enterprise 中组织级挂钩项目的异常列表
- css - 将CSS添加到R Shiny中滑块范围内的结束标签
- c# - 引用 Razor 类库时重复的基本路径
- r - 在 R 中具有逻辑条件的 For 循环