【问题标题】:how to save entity with relationship in spring boot如何在spring boot中保存具有关系的实体
【发布时间】: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


【解决方案1】:

您遇到空问题的原因是在@JoinColumn(name = "meeting_settings_name", nullable = false) 上您有nullable = false。您加入的列是meeting_settings_name,它似乎不是meeting_times 上的列,meeting_settings 上的实际名称是meeting_name。您必须将 meeting_name 添加到 meeting_times 以在两个表之间创建关系才能使其正常工作。

【讨论】:

  • meeting_settings_name 存在于 meeting_times 表中。没看懂你说的第二个是什么意思?我的意思是这部分:“您加入的列是 meeting_settings_name,它似乎不是 meeting_times 上的列,而 meeting_settings 上的实际名称是 meeting_name。您必须将 meeting_name 添加到 meeting_times 以创建两者之间的关系两张桌子让它工作。”抱歉,母语不是英语
  • 别担心!是的,所以在你的 MeetingsSetting 类中你有 @Column(name = "meeting_name") private String meetingName;这告诉我数据库中的列是“meeting_settings”表上的“meeting_name”。如果你想加入“meeting_times”,“meeting_times”表需要一个“meeting_name”列,它应该在你的“meeting_times”实体上。这也意味着 @JoinColumn(name = "meeting_settings_name", nullable = false) 是错误的,因为您实际上是在加入“meeting_name”列。这有帮助吗?
  • 嗨,将脚本更改为 meeting_names 后,我收到此错误:原因:org.hibernate.AnnotationException:mappedBy 引用了未知的目标实体属性:com.cbc.coorporateblinddateservice.entities.dates.MeetingTime。 com.cbc.coorporateblinddateservice.entities.meetinsSetting.MeetingsSetting.meetingTime 中的 meeting_setting 我现在将向您展示更新后的代码
  • 我确实查看了“更新代码”下的代码,上面写着 mappedBy = meetingName 还是我理解错了?
  • 是的,你是对的。感谢您的惊人帮助:) 我现在会尝试修复该错误
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2021-03-27
  • 2021-06-05
  • 2019-03-09
相关资源
最近更新 更多