首页 > 解决方案 > 如何在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 的保存方法。

标签: javaspringdatabasespring-boot

解决方案


在双向一对多中,您必须同步关联的双方。

您可以简单地遍历所有MeetingTime对象并设置对应MeetingSetting的对象。

MeetingSettingServicesaveMeeting方法可以做到这一点:

public void saveMeeting(MeetingsSetting meetingsSetting) {
    // ... 
    
    // here you're synchronizing both sides of the association
    meetingsSetting.getMeetingTime()
            .forEach(mt -> mt.setMeetingSetting(meetingSetting));
    // ...
    repository.save(meetingSetting);
}

推荐阅读