java - 如何在spring boot中将实体保存在与数据库的关系中
问题描述
我有一个包含两个实体的 Spring Boot 应用程序。MeetingSetting 和 MeetingTime meetingSetting 可以有无限的会议时间。到目前为止,数据库生成没有问题,但是当我尝试保存我的实体时,它们被保存但彼此不同,它们是独立保存的。含义 MeetingName 是 MeetingTime 中的外键未保存但被视为空(我调试并尝试找出原因但找不到任何东西)其他值已保存 -
有人能指出我的错误是什么吗?
这是我发送的 json:
{
"meetingName":"TEst",
"meetingPw":"",
"meetingTime":[
{
"date":"2021-05-31",
"startTime":"15:30",
"endTime":"16:30"
},
{
"date":"2021-06-21",
"startTime":"15:30",
"endTime":"17:30"
},
{
"date":"2021-06-21",
"startTime":"11:01",
"endTime":"11:01"
}
]
}
会议设置:
@Entity
@Table(name = "meeting_settings")
@Data
public class MeetingsSetting {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_name", unique = true)
private String meetingName;
@Column(name = "meeting_url")
private String meetingUrl;
@Column(name = "meeting_pw")
private String meetingPw;
@OneToMany(mappedBy = "meeting_Name", cascade = CascadeType.ALL)
private Set<MeetingTime> meetingTime = new HashSet<>();
}
会议时间:
@Entity
@Table(name = "meeting_times")
@Data
public class MeetingTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_date")
private String date;
@Column(name = "start_time")
private String startTime;
@Column(name = "end_time")
private String endTime;
@ManyToOne
@JoinColumn(name = "meeting_name" ,insertable = false, updatable = false , referencedColumnName = "meeting_name")
private MeetingsSetting meeting_Name;
}
这就是我尝试保存实体的方式:
@RestController
@RequestMapping("/api/meetingSetting")
public class MeetingSettingController {
@Autowired
MeetingSettingService meetingSettingService;
@PostMapping("/")
public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
meetingSettingService.saveMeeting(meetingsSetting);
}
}
我的服务调用 jpaRepository 的保存方法。
解决方案
在双向一对多中,您必须同步关联的双方。
您可以简单地遍历所有MeetingTime
对象并设置对应MeetingSetting
的对象。
你MeetingSettingService
的saveMeeting
方法可以做到这一点:
public void saveMeeting(MeetingsSetting meetingsSetting) {
// ...
// here you're synchronizing both sides of the association
meetingsSetting.getMeetingTime()
.forEach(mt -> mt.setMeetingSetting(meetingSetting));
// ...
repository.save(meetingSetting);
}
推荐阅读
- r - 使用 lubridate 将持续时间或周期四舍五入到整分钟
- vue.js - Vue 2 将值从子元素传递到父元素(自定义样式输入)
- javascript - webUSB api 工作,但接收到的数据未正确解码
- google-apps-script - The number of columns in the data does not match the number of columns in the range. The data has 0 but the range has 1(line 32, file "Code")
- c# - Visual Studio 16.8.2 - Analyzer with Code Fix project template produces errors when trying to debug unit test
- html - 如何在 xsl:copy-of 上禁用文本转义
- azure - 如何在 Azure 服务总线诊断日志上记录订阅自动删除事件?
- linux - gobuster 用 html 代码和空白填充屏幕
- simulator - 如何修复运行 devspace 模拟器时找不到基本名称 ncs_rest_sim、语言环境 en_us 的捆绑包
- haskell - 以 Yesod 形式将边距应用于内部元素