为什么 JpaRepository 在保存实体时试图为空 FK 键创建实体?



>我有带有字段国家/地区的Person表(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 : ОШИБКА: нулевое значение в столбце "code" нарушает ограничение NOT NULL Подробности: Ошибочная строка содержит (42, null, null, null(. 2020-01-30 15:16:37.299 错误 10524 --- [NIO-8098-exec-1] o.z.problem.spring.common.AdviceTraits : 内部服务器错误

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

粗略的错误跟踪:

错误

:"代码"列分隔符中的空值不是空限制 详细信息:错误字符串包含 (42, 空, 空, 空(。

Person.java
@Entity
@Table(name = "t_person")
@Data
public class Person {
@Id
@Column(name = "person_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String surname;
private String name;
private String patronymic;
@Column(name = "surname_rus")
private String surnameRus;
@Column(name = "name_rus")
private String nameRus;
@Column(name = "surname_eng")
private String surnameEng;
@Column(name = "name_eng")
private String nameEng;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "country_id")
private Country country;
private String settlement;
private String occupation;
@ManyToMany
@JoinTable(
name = "person_link",
joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id"),
inverseJoinColumns = @JoinColumn(name = "link_id", referencedColumnName = "link_id"))
private List<UrlLink> linkList;
@ManyToMany
@JoinTable(
name = "org_actor",
joinColumns = @JoinColumn(name = "actor_id", referencedColumnName = "person_id"),
inverseJoinColumns = @JoinColumn(name = "org_id", referencedColumnName = "org_id"))
private List<Org> orgList;
private String description;
@ManyToMany
@JoinTable(
name = "person_hashtag",
joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id"),
inverseJoinColumns = @JoinColumn(name = "hashtag_id", referencedColumnName = "hashtag_id"))
private List<HashTag> hashtagList;

************
Country.java
@Entity
@Table(name="t_country")
@Data
public class Country {
@Id
@Column(name = "country_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String code;
private String name;
}
create table t_country
(
country_id serial  not null
constraint t_country_pkey
primary key,
code       char(3) not null
constraint unique_constr_code
unique,
name       text
constraint unique_constr_name
unique,
miscellany text,
constraint constr_name
unique (code, name)
);

如何保存具有空国家/地区的个人实体?

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

code
char(3) not null
constraint unique_constr_code
unique,

表示数据库级别存在非空约束。

这就是为什么你不能用一个有空地的国家拯救一个人。

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

最新更新