【发布时间】:2020-11-30 21:58:26
【问题描述】:
我正在努力理解如何使用 Spring Data/JPA 与数据库进行交互。我目前正在使用简单的 H2 数据库进行测试。
我有一个主要项目Task,除了字段之外,还有两个“子”数据集合:TaskNote 和StateChangeHistory。
在我的任务服务类中,我有一个@PostConstruct 方法来设置一些虚拟数据并将其保存到数据库中,以便稍后检索和显示它。似乎Task 正在被保存,但没有一个孩子被保存。当我将数据加载到视图中(或在调试器中检查数据)时,子集合始终为空。
我需要做些什么来确保任务及其子项都被保存?
以下是部分代码:
Task.java:
@Entity
@NamedEntityGraph(name = "graph.task", attributeNodes = { @NamedAttributeNode("notes") })
public class Task extends AbstractEntity {
@OneToMany(mappedBy = "task")
private List<StateChangeHistory> stateHistory = new ArrayList<>();
@OneToMany(mappedBy = "task")
private List<TaskNote> notes = new ArrayList<>();
...
}
TaskNote.java:
@Entity
public class TaskNote extends AbstractEntity {
@ManyToOne
private Task task;
...
}
TaskRepository.java:
public interface TaskRepository extends JpaRepository<Task, Long> {
@Override
@EntityGraph(attributePaths = { "notes" })
public List<Task> findAll();
}
TaskService.java:
@Service
public class TaskService {
private TaskRepository taskRepository;
public TaskService(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
...
@PostConstruct
public void populateTestData() {
if (taskRepository.count() == 0) {
Task task = null;
TaskNote note = null;
// Task 1
task = new Task("Task-1");
task.setPriority(TaskPriority.HIGH);
task.setType(TaskType.RECURRING);
// Note 1
note = new TaskNote();
note.setNote("note-1");
task.getNotes().add(note);
// Note 2
note = new TaskNote();
note.setNote("note-2");
task.getNotes().add(note);
taskRepository.save(task);
// Task 2
taskRepository.save(new Task("Task-2"));
}
}
}
如您所见,我创建了一个任务对象并向其中添加了两个注释,然后尝试保存它。我假设保存任务是可行的,因为我可以让它们显示在我的视图中。但是,备注列表始终为空。
我需要做什么才能将子数据与父数据一起保存?
【问题讨论】:
-
在@OneToMany注解中添加'cascade'属性会解决问题吗? cascade=CascadeType.ALL
标签: java spring-boot spring-data-jpa