微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在休眠中保存外键?

如何解决如何在休眠中保存外键?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。