如何解决如何在休眠中保存外键?
我有一个包含任务列表的时间表实体。当我尝试向时间表添加新任务时,除外键外,所有内容都会被保存。任何想法我应该如何避免使用自定义 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 举报,一经查实,本站将立刻删除。