Java 为什么JpaRepository在保存实体时尝试为空FK密钥创建实体?

Java 为什么JpaRepository在保存实体时尝试为空FK密钥创建实体?,java,hibernate,foreign-keys,Java,Hibernate,Foreign Keys,我有Person表,表中有字段country(FK,可以为空)。 当我试图用空的国家/地区值保存个人时,我将得到一个错误500和消息 2020-01-30 15:16:37.277警告10524---[nio-8098-exec-1]o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:0,SQLState:23502 2020-01-30 15:16:37.277错误10524---[nio-8098-exec-1]o.h.engine.jdbc.spi.S

我有Person表,表中有字段country(FK,可以为空)。 当我试图用空的国家/地区值保存个人时,我将得到一个错误500和消息

2020-01-30 15:16:37.277警告10524---[nio-8098-exec-1]o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:0,SQLState:23502 2020-01-30 15:16:37.277错误10524---[nio-8098-exec-1]o.h.engine.jdbc.spi.SqlExceptionHelper:Мззгзгббббббгббгббг Пбббббббб:бббббббббббж1073。 2020-01-30 15:16:37.299错误10524---[nio-8098-exec-1]o.z.problem.spring.common.adviceTracts:内部服务器错误

org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句

粗差交易:

错误:“代码”列中的null值打破了非null限制详细信息:错误字符串包含(42,null,null,null)

Person.java
@实体
@表(name=“t_person”)
@资料
公共阶层人士{
@身份证
@列(name=“person\u id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
私家姓;
私有字符串名称;
私人字符串主音;
@列(name=“姓氏”)
私人字符串;
@列(name=“name\u rus”)
私有字符串名称;
@列(name=“name_eng”)
私家车;
@列(name=“name\u eng”)
私有字符串名称;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“country\u id”)
私人国家;
私人结算;
私人字符串占用;
@许多
@可接合(
name=“person\u link”,
joinColumns=@JoinColumn(name=“person\u id”,referencedColumnName=“person\u id”),
inverseJoinColumns=@JoinColumn(name=“link\u id”,referencedColumnName=“link\u id”))
私有列表链接列表;
@许多
@可接合(
name=“org\u actor”,
joinColumns=@JoinColumn(name=“actor\u id”,referencedColumnName=“person\u id”),
inverseJoinColumns=@JoinColumn(name=“org\u id”,referencedColumnName=“org\u id”))
私人名单;
私有字符串描述;
@许多
@可接合(
name=“person\u标签”,
joinColumns=@JoinColumn(name=“person\u id”,referencedColumnName=“person\u id”),
inverseJoinColumns=@JoinColumn(name=“hashtag\u id”,referencedColumnName=“hashtag\u id”))
私有列表hashtagList;
************
Country.java
@实体
@表(name=“t_国家”)
@资料
公营国家{
@身份证
@列(name=“country\u id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
私有字符串码;
私有字符串名称;
}
创建表t_country
(
国家/地区id序列号不为空
国家约束
主键,
代码字符(3)不为空
约束唯一构造码
独特的,
名称文本
约束唯一的构造名称
独特的,
杂项文本,
约束构造名称
唯一(代码、名称)
);

如何使用空国家/地区保存个人实体?

在您的国家/地区数据库表定义中,字段代码定义为

code
   char(3) not null
    constraint unique_constr_code
        unique,
意味着在db级别上存在NOTNULL约束

这就是为什么你不能用一个空旷的国家来拯救一个人


因此,即使java代码中没有NOTNULL约束,db也会拒绝该值。也许您在删除java代码中的NOTNULL约束后忘记迁移db?

在您的国家/地区db表定义中,字段代码定义为

code
   char(3) not null
    constraint unique_constr_code
        unique,
意味着在db级别上存在NOTNULL约束

这就是为什么你不能用一个空旷的国家来拯救一个人


因此,即使您的java代码中没有NOTNULL约束,db也会拒绝该值。也许您在删除java代码中的NOTNULL约束后忘记迁移db?

您确定国家是空的吗?错误似乎表明存在id为42的国家。id为42的国家表中没有此类实体。I假设有人试图创建id为42的新实体,并通过原因码country null返回null错误。在创建t_country时在quiestion中添加了sql。当您保存此人时,country为null?或者您是否使用null字段实例化了一个country?我试图使用“empty”country保存,但有500个错误。如果我亲自保存记录表1:一切正常。空国家/地区是具有空字段的国家/地区还是空的国家/地区?如果是具有空字段的国家/地区,则在国家/地区db表定义中有NOTNULL约束(不在java代码中!)。可能您将代码定义为nullable=false,并在不更改db定义的情况下将其删除?您确定国家/地区为空吗?此错误似乎表明存在id为42的国家/地区。id为42的国家/地区表中没有此类实体。我想有人试图创建id为42的新实体,并返回带有null的错误,原因是:e country null。在创建t_country时在quiestion中添加了sql。当您保存人员时,国家为null?或者您是否实例化了具有null字段的国家?我尝试使用“空”国家保存,但有500个错误。如果我手动将记录保存在person表中,则一切正常。空国家是具有空字段的国家还是空的国家?如果是空的如果国家/地区字段为空,则在国家/地区数据库表定义中(而不是在java代码中!)有一个NOTNULL约束。可能您将代码定义为nullable=false并将其删除