如何在休眠中保存外键?

问题描述

我有一个包含任务列表的时间表实体。当我尝试向时间表添加新任务时,除外键外,所有内容都会被保存。任何想法我应该如何避免使用自定义 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领域。