【发布时间】:2021-08-18 23:50:32
【问题描述】:
我有一个 Spring Boot 应用程序,我想在其中发送一个具有关系的 json 对象。我有一个名为 meetingSetting 的实体和一个名为 meetingTime 的实体。 MeetingSetting 可以有尽可能多的 meetingTimes,一个 meetingTime 对象属于一个 meetingSetting。但是当我尝试发送它时,我收到以下错误:
not-null property references a null or transient value : com.cbc.coorporateblinddateservice.entities.dates.MeetingTime.meetingsSetting
我尝试调试并注意到在 json 中发送的时间对象中发送时,meetingSetting 为空。有人可以看看我的代码并告诉我我缺少什么,我的猜测是我必须在 meetingSettings 中扩展我的 saveMethod 但这只是一个猜测。
这是我的 MeetingSetting 实体:
@Entity
@Table(name = "meeting_settings")
@Data
public class MeetingsSetting {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_name")
private String meetingName;
@Column(name = "meeting_url")
private String meetingUrl;
@Column(name = "meeting_pw")
private String meetingPw;
@OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
private Set<MeetingTime> meetingTime = new HashSet<>();
}
meetingTime 实体:
@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_settings_name", nullable = false)
private MeetingsSetting meetingsSetting;
}
会议设置控制器:
@RestController
@RequestMapping("/api/meetingSetting")
public class MeetingSettingController {
@Autowired
MeetingSettingService meetingSettingService;
@PostMapping("/")
public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
meetingSettingService.saveMeeting(meetingsSetting);
}
服务:
@Service
public class MeetingSettingService {
@Autowired
MeetingSettingRepository meetingSettingRepository;
public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
meetingSettingRepository.save(meetingsSetting);
}
更新新代码:
会议时间:
@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(cascade = CascadeType.ALL)
@JoinColumn(name = "meeting_name", nullable = false)
private MeetingsSetting meetingName;
}
会议设置:
@Entity
@Table(name = "meeting_settings")
@Data
public class MeetingsSetting {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_name")
private String meetingName;
@Column(name = "meeting_url")
private String meetingUrl;
@Column(name = "meeting_pw")
private String meetingPw;
@OneToMany(mappedBy = "meetingName", cascade = CascadeType.ALL)
private Set<MeetingTime> meetingTime = new HashSet<>();
}
Sql 脚本:
create table meeting_times
(
id bigint auto_increment
primary key,
meeting_date varchar(255) null,
start_time varchar(255) null,
end_time varchar(255) null,
meeting_name varchar(255) null,
constraint fk_meeting_times__meeting_settings_name
foreign key (meeting_name) references meeting_settings (meeting_name)
);
【问题讨论】:
-
meeting_settings 表如何链接到 meeting_times 表?比如,他们是外键关系吗?通常在@OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL) 中,mappedBy 设置为foreignKey 所在的字段。 @JoinColumn(name = "meeting_settings_name", nullable = false) 也有点偏离,因为这表示该实体是通过名为“meeting_settings_name”的字段加入的,但 MeetingTime 没有名为 meeting_settings_name 的列来进行加入并且 meetingSettings 上的字段称为“meeting_name”而不是“meeting_settings_name”
-
您也不需要服务方法上的@RequestBody。这仅在从服务调用到实际的 java 应用程序时在您的控制器中使用。
-
meeting_settings_name 是 meeting_times 表上的外键
-
这是我为 meeting_times 生成表的脚本,我还需要引用 meeting_names 吗?创建表 meeting_times ( id bigint auto_increment 主键, meeting_date varchar(255) null,start_time varchar(255 ) null, end_time varchar(255) null, meeting_settings_id bigint null, 约束 fk_meeting_times__meeting_settings_name 外键 (meeting_settings_name) 引用 meeting_settings (meeting_name) );
-
不只是编辑,这是我的错误,我发布了错误的版本。现在外键是 meeting_settings_name 引用另一个表中的 meeting_name。但我现在正在另一篇文章中尝试你的建议
标签: java json spring spring-boot rest