Java Hibernate@OneToMany Set在API端点中收到时失去其顺序
我在从react前端接收javaapi端点中的有序数据时遇到问题 特别是它是一个JSON数组,其中递归地包含了树结构中的对象和数组,如下面编写的示例所示 问题:如何以正确的顺序接收由Hibernate在Set subChildren内部映射的subChildren数组?我可能丢失了一些hibernate注释或其他内容 如果我进入调试模式,我会发现在输入savePeopleByDynastyId()方法的第一行代码后,peopleList中的Set子元素丢失了顺序 (我想为Person对象实现的正确顺序:child1、child2、child3) 这是唯一的方式发送他们与身份证已经(我宁愿避免)?如果是,我应该向Java Hibernate@OneToMany Set在API端点中收到时失去其顺序,java,json,hibernate,api,one-to-many,Java,Json,Hibernate,Api,One To Many,我在从react前端接收javaapi端点中的有序数据时遇到问题 特别是它是一个JSON数组,其中递归地包含了树结构中的对象和数组,如下面编写的示例所示 问题:如何以正确的顺序接收由Hibernate在Set subChildren内部映射的subChildren数组?我可能丢失了一些hibernate注释或其他内容 如果我进入调试模式,我会发现在输入savePeopleByDynastyId()方法的第一行代码后,peopleList中的Set子元素丢失了顺序 (我想为Person对象实现的正
@OneToMany private Set子项添加什么注释来实现这一点?我尝试了@OrderBy(value=“id”)
,但它不起作用
感谢您的帮助
使用Postman发送的JSON数据模拟POST请求:
http://localhost:8080/api/dynasty/people
[
{
name: father,
age: 50,
subChildren : [
{
name: child1,
age: 30,
subChildren : []
},
{
name: child2,
age: 28,
subChildren : []
},
{
name: child3,
age: 26,
subChildren : []
},
]
}
]
Person.java:
@Entity
@Table(name="Person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private Integer age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ID_PARENT")
@JsonIgnore
private Person parent;
@OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
@OrderBy(value = "id")
private Set<Person> subChildren = new LinkedHashSet<Person>();
public Person(){}
//Getter and Setter
}
@实体
@表(name=“Person”)
公共阶层人士{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串名称;
私人整数年龄;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“ID\u PARENT”)
@杰索尼奥雷
私人家长;
@OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER)
@订购人(value=“id”)
private Set subChildren=new LinkedHashSet();
公众人物(){}
//接二连三
}
DynastyController.java:
@RestController
@CrossOrigin
@RequestMapping("/api/dynasty")
public class DynastyController {
@PostMapping("/people")
public ResponseEntity<?> savePeopleByDynastyId(@RequestBody Iterable<Person> peopleList, BindingResult result){
Iterable<Person> newPeopleList = null;
for (Person person : peopleList) {
//intention : cycle through each person of subChildren array recursively and persist each of his person
}
ResponseEntity<Iterable<Person>> responseEntity= new ResponseEntity<>(newPeopleList, HttpStatus.CREATED);
return responseEntity;
}
}
@RestController
@交叉起源
@RequestMapping(“/api/devention”)
公共类动态控制器{
@邮戳(“/人”)
public ResponseEntity savePeopleByDynastyId(@RequestBody Iterable peopleList,BindingResult){
Iterable newPeopleList=null;
for(个人:peopleList){
//意图:递归地遍历子孩子数组中的每个人,并持久化每个人
}
ResponseEntity ResponseEntity=新的ResponseEntity(newPeopleList,HttpStatus.CREATED);
返回响应性;
}
}
我认为问题在于Jackson所做的反序列化。它用普通的哈希集
替换集合,而不是添加到现有的链接哈希集
。尝试将LinkedHashSet
类型用作实体中声明的类型。orderby id可能不起作用,因为您在响应列表中没有id。请尝试在回复中包含id并检查。谢谢您的回复。我在回复列表中用id试过了,但不起作用。我没有把id放在问题中,因为我想找到一个解决方案,而不从前端发送id,因为我认为当对象持久化到数据库中时,应该在业务层生成id。不幸的是,我无法更改linkedHashSet中的集合,因为它不会编译,Hibernate要求:“一对多”属性类型应为[java.util.Collection,java.util.List,java.util.Set]您是否检查过,反序列化后该集的类型仍然是链接哈希集?通过调试到控制器方法并检查变量的对象类型。我确认它是哈希集,我能做什么?根据Hibernate文档,通过添加@OrderBy注释,应该将集合转换为按指定值排序的LinkedHashSet,因此您是说问题在于,在Hibernate操作之前,Jackson将JSON数组反序列化为哈希集