Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@OneToMany Set在API端点中收到时失去其顺序_Java_Json_Hibernate_Api_One To Many - Fatal编程技术网

Java Hibernate@OneToMany Set在API端点中收到时失去其顺序

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对象实现的正

我在从react前端接收javaapi端点中的有序数据时遇到问题

特别是它是一个JSON数组,其中递归地包含了树结构中的对象和数组,如下面编写的示例所示

问题:如何以正确的顺序接收由Hibernate在Set subChildren内部映射的subChildren数组?我可能丢失了一些hibernate注释或其他内容

如果我进入调试模式,我会发现在输入savePeopleByDynastyId()方法的第一行代码后,peopleList中的Set子元素丢失了顺序

(我想为Person对象实现的正确顺序:child1、child2、child3)

这是唯一的方式发送他们与身份证已经(我宁愿避免)?如果是,我应该向
@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数组反序列化为哈希集