问题描述
我有一个包含任务列表的时间表实体。当我尝试向时间表添加新任务时,除外键外,所有内容都会被保存。任何想法我应该如何避免使用自定义 sql 查询创建方法并以休眠方式完成工作?
我的时间表实体:
@Entity
@Table(name = "timesheet")
public class Timesheet {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private LocalDate date;
@OnetoMany(
mappedBy = "timesheet",cascade = CascadeType.ALL,orphanRemoval = true,fetch = FetchType.EAGER
)
@JsonManagedReference
private List<Task> tasks = new ArrayList<>();
我的任务:
@Entity
@Table(name = "task")
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String title;
private Integer hours;
@ManyToOne
@JsonBackReference
private Timesheet timesheet;
服务实现:
@Override
public void addTask(int timesheetId,TaskVO taskVO) {
Timesheet oldTimesheet = timesheetRepository.findById(timesheetId).orElse(new Timesheet(date,tasks));
Task task = taskMapper.transformToEntity(taskVO);
taskRepository.save(task);
oldTimesheet.getTasks().add(task);
timesheetRepository.save(oldTimesheet);
}
解决方法
缺少从 Task
对象到其所有者 Timesheet
的链接。填充这个关系应该把Task
表中的外键列持久化,否则JPA持久化器仍然会将timesheet
对象中的Task
字段视为空:
@Override
public void addTask(int timesheetId,TaskVO taskVO) {
Timesheet oldTimesheet = timesheetRepository.findById(timesheetId).orElse(new Timesheet(date,tasks));
Task task = taskMapper.transformToEntity(taskVO);
task.setTimesheet(oldTimesheet); // need this
taskRepository.save(task);
oldTimesheet.getTasks().add(task);
timesheetRepository.save(oldTimesheet);
}
注意:我不确定这一点,但如果您在最后保存时间表,您可能不需要保存任务,因为 CascadeType.ALL
上有 tasks
领域。