我试图在Spring创建两个实体之间的多对一映射。然而,当我尝试使用restController获取值时,我得到了
JAVAlang.IllegalStateException:在提交响应后无法调用sendError()
错误和无限JSON响应。添加JSON ignore解决了这个问题,但我的回复中根本没有这个列。我不知道怎么解决这个问题。请帮忙。提前谢谢。
以下是我的实体:
@Entity
@Table(name="tbl1")
public class Data {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "customer")
private String customer;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="data_id", insertable = true, nullable = false, updatable = false)
private DataList dataList1;
}
@Entity
@Table(name="tbl2")
public class DataList {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="data_id")
private Long dataId;
@Column(name="user_name")
private String userName;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,mappedBy = "dataList1")
private List<Data> data1;
}
存储库:
@Repository
@Transactional
public interface DataList extends JpaRepository<DataList,Long> {
}
@Repository
@Transactional
public interface Data extends JpaRepository<Data,Long> {
}
我的错误:Java。lang.IllegalStateException:在提交响应后无法调用sendError()
LAZY
,当需要相关实体时,使用fetch-join-query
您可能认为将一些模型映射到另一个模型是极其无聊的。但在这里以另一种方式。Hibernate实体不应该传递给前端。我的应用程序使用几种类型的对象:Entities
(当从DB获取时)、DTO
(当将实体映射到DTO并给出它们的服务内组件时)、Shared
(当将DTO映射到Shared并作为对我的微服务之间的控制器的响应共享时)和Model
(当从响应映射到模型并给出模板引擎时,例如freemarker)。您可能不需要这种模型层次结构。
创建DTO:
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class DataListDto {
private Long dataId;
private String userName;
private List<DataDto> data1;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class DataDto {
private long id;
private String customer;
}
写下你的地图:
public class DataListMapper {
public static DataListDto mapToDto(DataList dataList) {
return new DataListDto(dataList.getDataId(), dataList.getUserName(), dataList.getData1().stream().map(x -> DataListMapper.mapToDto(x).collect(Collectors.toList)))
}
public static DataDto mapToDto(Data data) {
return new DataDto(data.getId(), data.getCustomer());
}
}
您的服务:
public class DataListService {
@Autowired
private DataListRepository dataListRepository;
public List<DataListDto> getAllData() {
List<DataList> dataLists = this.dataListRepository.findAll();
return dataLists.stream().map(x->DataListMapper.mapToDto(x)).collect(Collectors.toList());
}
}
当JSON序列化程序试图一次又一次地递归序列化这两个实体时,就会发生这种情况。
因此,在序列化数据时,其成员
dataList1
属于DataList
类型,该类型进一步包含List
理想情况下,在这种情况下,实体应该映射到用于序列化和响应的其他模型,或者其中一个模型需要是
@JsonIgnore
,以避免这种递归循环。
1)一般来说,将fetch=FetchType。EAGER
放在@OneTo众多
上不是明智的做法。尝试将其设置为LAZY。
2) 确保数据和数据列表实体正确地实现了equals()
和hashCode()
方法。
将返回响应的控制器类的代码: 下面是具有一对一映射的两个实体类。 我得到的回应是: 如上面的响应所示,我只得到json值,我的意思是只得到没有列名的表值。因此,如何将json响应映射到响应协同响应键上。
参考此Hibernate文档后 在我的情况下,将“Person”替换为“Employee”,将“Phone”替换为“Company”,将“Person\u Phone”替换为“EmployeeCompany”。 以上Hibernate docs示例和my project示例的唯一区别是黑白。在Hibernate文档示例“Person\u Phone”中,将“phones\u Id”作为唯一约束。而
我正在尝试将从远程服务获得的响应映射到对象中。对于客户端,我使用的是 JAX-RS 注释接口: 响应采用以下格式,作为对象的JSON列表: 我试图映射到的类是: 它总是返回一个带有空项目列表的项目实例。有什么想法吗? 更新 将其更改为: 返回
我收到http请求的响应,格式如下: 当我执行下面的代码时,我想将其映射到DTO中: DTO类别: 另一个类是: 当我尝试将FinalTestDt中的响应映射到类时,它会引发一个异常: WARN:org.springframework.http.converter.json.MappingJackson2HttpMessageConzer-无法评估类型[简单类型,类FinalTestDTO]的反序
有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是
在进行web客户端调用并使用前一个Mono的响应后,我无法在映射中获得填充值。以下是我所尝试的代码。parameters.size()的值为零。无法获得该值未被文件化的原因。我基本上希望从该方法返回年龄(而不是单对象)。使用block给出一个错误block()/blockfirst()/blocklast()是blocking,这在thread Reactor-http-nio-3中是不支持的。