【问题标题】:Adding elements of entity to the same - @OneToMany将实体元素添加到相同 - @OneToMany
【发布时间】:2019-01-09 00:02:12
【问题描述】:

我将Task 实体表示为:

@Entity
@Getter
@NoArgsConstructor
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @NotBlank
    private String name;
    @Enumerated(EnumType.STRING)
    private Category category;
    @OneToOne
    private Employee assignee;
    @OneToMany
    private List<Task> precedingTasks;
    private String details;
    private int estimatedTimeInMinutes;
    private LocalDateTime deadline;
    private LocalDateTime creationTime;
    private LocalDateTime startTime;
    private LocalDateTime endTime;

    public Task(String name, Category category, Employee assignee, List<Task> precedingTasks, String details,
                int estimatedTimeInMinutes, LocalDateTime deadline) {
        this.name = name;
        this.category = category;
        this.assignee = assignee;
        this.precedingTasks = precedingTasks;
        this.details = details;
        this.estimatedTimeInMinutes = estimatedTimeInMinutes;
        this.deadline = deadline;
        this.creationTime = LocalDateTime.now();
        this.startTime = null;
        this.endTime = null;
    }

我注意到没有precedingTasks 的任务被正确添加,但没有。

例如:添加三个没有precedingTasks的任务后,我在Postman中发送POST如下:

{
    "name": "Wyslac przesyłke nr 87",
    "category": "TODO",
    "assigneeId": 1,
    "precedingTasksId": [1, 2, 3],
    "details": "Dodac zakladke",
    "estimatedTimeInMinutes": 78,
    "deadline": "2013-12-18T14:30:40.100000000"
}

但是我得到一个没有preceding tasks的任务:

{
    "id": 4,
    "name": "Wyslac przesyłke nr 87",
    "category": "TODO",
    "assignee": {
        "id": 1,
        "firstName": "Wojciech",
        "lastName": "Wasilewski",
        "email": "wojtek@wasilewski.pl",
        "role": "ADMIN",
        "password": "h*n$GvFE",
        "manager": true,
        "password_LENGTH": 8,
        "passwordValid": false
    },
    "precedingTasks": [],
    "details": "Dodac zakladke",
    "estimatedTimeInMinutes": 78,
    "deadline": "2013-12-18T14:30:40.1",
    "creationTime": "2018-08-01T13:38:45.924",
    "startTime": null,
    "endTime": null
}

我使用这个控制器:

@PostMapping("/tasks")
@ResponseStatus(HttpStatus.CREATED)
public Task addNewTask(@RequestBody TaskRequest taskRequest) {
    String name = taskRequest.getName();
    Category category = taskRequest.getCategory();
    checkIfAssigneeExists(taskRequest.getAssigneeId());
    Employee assignee = employeeRepository.findById(taskRequest.getAssigneeId()).get();
    List<Task> precedingTasks = new ArrayList<>();

    if (taskRequest.getPrecedingTaskIds() != null)
        taskRequest.getPrecedingTaskIds().forEach(id -> precedingTasks.add(taskRepository.findById(id).get()));

    String details = taskRequest.getDetails();
    int estimatedTimeInMinutes = taskRequest.getEstimatedTimeInMinutes();
    LocalDateTime deadline = taskRequest.getDeadline();
    Task task = new Task(name, category, assignee, precedingTasks, details, estimatedTimeInMinutes, deadline);
    taskRepository.save(task);
    return task;
}

还有这样的要求:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TaskRequest {

    @NonNull
    private String name;

    @NonNull
    private Category category;

    @NonNull
    private Long assigneeId;

    @NonNull
    private List<Long> precedingTaskIds;

    private String details;
    private int estimatedTimeInMinutes;

    @NonNull
    private LocalDateTime deadline;
}

怎么了? JSON 中 ArrayList 的控制器或格式?我应该在添加整个任务之前将precedingTasks 添加到数据库吗?

【问题讨论】:

  • 您需要添加 CascadeType。 @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 在前面的任务上
  • @pvpkiran 谢谢你的回复,但结果还是一样:/

标签: java json arraylist spring-data-jpa entity


【解决方案1】:

您的类 TaskRequest 中的字段 precedingTaskIds 在名称上与您的 POST 请求 precedingTasksId 中的字段不对应。在 Postman 中重命名或重写 POST。

【讨论】:

  • 这可以解释为什么测试通过了 :) 非常感谢!
【解决方案2】:

您发布“precedingTasksId”,但该类需要“precedingTasksIds”。

似乎只是一个错字。

让我知道这是否有效。

【讨论】:

  • 是的,我之前没有注意到这一点。感谢您的帮助,但 Maxim 更快地获得了“最佳答案”; )
  • 哈哈。没问题。我没有看到他的回答。很高兴你得到你的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多