首页 > 解决方案 > java.sql.SQLException:字段 foreign_key 没有默认值

问题描述

我有以下模型结构:

@Entity
@Table(name = "MY_TEMPLATE")
public class MyTemplate {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "MY_TEMPLATE_ID")
    private List<MyObject> myobjects = new ArrayList<>();
    ...
}

@Entity
@Table(name = "MY_OBJECT")
public class MyObject implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
}

MyDailyResource没有参考MyTemplate

我也经常CrudRepository

public interface MyTemplateRepository extends CrudRepository<MyTemplate, Long> {
}

当我执行时:

myTemplateRepo.save(myTemplate)// myTemplate 在 myObjects 集合中有一个元素

我看到以下错误:

    insert 
    into
        MY_TEMPLATE
        (LAST_MODIFIED, LAST_MODIFIED_BY, NAME) 
    values
        (?, ?, ?)


    insert 
    into
        MY_OBJECT
        (BAR, FOO) 
    values
        (?, ?)

java.sql.SQLException: Field 'MY_TEMPLATE_ID' doesn't have a default value
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

我不知道我做错了什么以及如何解决它。

请你给我推荐点东西好吗?

附言

看起来是因为我对数据库中的外键没有空约束。但我不喜欢删除那个约束

标签: javahibernatespring-bootspring-data-jpaforeign-keys

解决方案


希望您的父表是 MY_TEMPLATE 而子表是 MY_OBJECT

更新你的课程

@Entity
@Table(name = "MY_TEMPLATE")
public class MyTemplate {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
    @OneToMany(mappedBy="myTemplate", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<MyObject> myObjects = new ArrayList<>();
    ...
}

@Entity
@Table(name = "MY_OBJECT")
public class MyObject implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, updatable = false)
    private Long id;
    @ManyToOne
    @JoinColumn(name = "MY_TEMPLATE_ID")
    private MyTemplate myTemplate;
}

推荐阅读