>我有带有字段国家/地区的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 代码中的非空约束后忘记迁移数据库?