为什么json不显示列表中的对象?

时间:2018-11-09 11:03:09

标签: java json hibernate

我正在做一个小小的宠物项目,无法解决这种情况。简单来说,我有2个表,一个是ToDoBlock,另一个是与OneToMany关系的ToDo。因此,我在Idea的httpClient中使用Post创建了ToDoBlock,然后使用另一个POST将ToDo添加到了ToDo,但是当我使用GET调用ToDoBlocks时,它没有我的ToDos列表,但有,但是数组为空。

JSON发布ToDoBlock:

POST http://localhost:8080/todos/create-todo-block
Content-Type: application/json

{
 "name" : "block2"
}

JSON Post ToDo:

POST http://localhost:8080/todos/create-simple-todo/1
Content-Type: application/json

{
 "text" : "my third todo"
}

JSON GET所有块:(工作正常)

GET http://localhost:8080/todos/get-all-blocks
Content-Type: application/json

JSON获取所有待办事项:

GET http://localhost:8080/todos/find-all-todos
Content-Type: application/json

控制器:

@PostMapping(value = "/create-todo-block")
@ResponseStatus(HttpStatus.CREATED)
public void createToDoBlock(@RequestBody ToDoBlock toDoBlock){
    toDoService.saveToDoBlock(toDoBlock);
}

@PostMapping(value = "/create-simple-todo/{blockId}")
@ResponseStatus(HttpStatus.CREATED)
public void createToDo(@PathVariable long blockId, @RequestBody String text){
    toDoService.saveSimpleToDo(text, blockId);
}

DAO:

@Override
public void saveToDoBlock(ToDoBlock toDoBlock) {
    entityManager.persist(toDoBlock);
}

@Override
public void saveSimpleToDoByBlockId(String text, long blockId) {
    ToDo toDo = new ToDo(text);
    ToDoBlock block = entityManager.getReference(ToDoBlock.class, blockId);
    block.addToDo(toDo);
    entityManager.persist(block);
}

邮递员的回复:

[
{
    "id": 1,
    "name": "block",
    "archive": null,
    "toDos": []
}

]

实体待办事项:

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(of = "id")
@Entity
@Table(name = "todo")
public class ToDo {

@Id
@GeneratedValue
private Long id;

@Column (nullable = false)
private String text;

@Column
private Scaryness scaryness;

@Column
private Hardness hardness;

@Column
private boolean ready;

@Column
private LocalDateTime createdOn;

@ManyToOne
@JoinColumn(name = "todo_block_id")
private ToDoBlock toDoBlock;

public ToDo(String text, ToDoBlock todoBlock) {
    this.text = text;
    this.toDoBlock = todoBlock;
    this.ready = false;
    this.createdOn = LocalDateTime.now();
}

}

实体ToDoBlock:

@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
@Setter
@Getter
@Entity
@Table(name = "todo_block")
public class ToDoBlock {

@Id
@GeneratedValue
private Long id;

@Column(name = "name")
private String name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "archive_id")
private Archive archive;

@Setter(AccessLevel.PRIVATE)
@OneToMany(mappedBy = "toDoBlock")
private List<ToDo> toDos = new ArrayList<>();

public void addToDo(ToDo toDo){
    toDos.add(toDo);
    toDo.setToDoBlock(this);
}

public void removeToDo(ToDo toDo){
    toDos.remove(toDo);
    toDo.setToDoBlock(null);
}

}

1 个答案:

答案 0 :(得分:0)

请通过https://github.com/ygor-sk/stackoverflow/tree/master/q53224496-many-to-one-not-in-json

检查我的解决方案

关键是明确保存新的ToDo实体。仅将其添加到ToDoBlock的集合中是不够的。

public void saveSimpleToDoByBlockId(String text, long blockId) {
    ToDoBlock block = entityManager.getReference(ToDoBlock.class, blockId);
    ToDo toDo = new ToDo(text, block);
    block.addToDo(toDo);
    entityManager.persist(toDo); // <----- persist ToDo too
    entityManager.persist(block);
}

另一种可能是定义级联,如此处所述:JPA Updating Bidirectional Association

此外,我必须使用@JsonIgnore注释对ToDo到ToDoBlock的引用进行注释。否则,在序列化为JSON的过程中会遇到stackoverflow异常。

@JsonIgnore
@ManyToOne
@JoinColumn(name = "todo_block_id")
private ToDoBlock toDoBlock;