Почему JpaRepository при сохранении сущности пытался создать сущность для нулевого ключа FK? - PullRequest
1 голос
/ 30 января 2020

У меня есть Персона таблица с полем страна в нем ( FK, может быть нулевой ). Когда я пытаюсь сохранить Персона с пустым значением страна , я получаю сообщение об ошибке 500 и сообщение

2020-01-30 15 : 16: 37.277 WARN 10524 --- [nio-8098-exe c -1] ohengine.jdb c .spi.SqlExceptionHelper: SQL Ошибка: 0, SQLState: 23502 2020-01-30 15:16 : 37.277 ОШИБКА 10524 --- [nio-8098-exe c -1] ohengine.jdb c .spi.SqlExceptionHelper: ОШИБКА: нулевое значение в столбце "code" нарушает ограничение NOT NULL Подробности: ошибочная строка содержит (42 , ноль, ноль, ноль). 2020-01-30 15: 16: 37.299 ОШИБКА 10524 --- [nio-8098-exe c -1] ozproblem.spring.common.AdviceTraits: внутренняя ошибка сервера

org.springframework.dao. DataIntegrityViolationException: не удалось выполнить инструкцию; SQL [н / п]; ограничение [ноль]; вложенное исключение: org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию

Грубая обработка ошибок:

Ошибка: нулевое значение в столбце «код» разрывается NOT NULL ограничение Подробности: строка ошибки содержит (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)
);

Как сохранить сущность Person с пустой страной?

1 Ответ

0 голосов
/ 30 января 2020

В определении таблицы базы данных вашей страны поле код определено как

code
   char(3) not null
    constraint unique_constr_code
        unique,

означает, что на уровне базы данных есть ненулевое ограничение.

Вот почему Вы не можете сохранить человека со страной с пустыми полями.

Таким образом, даже если у вас нет ненулевого ограничения в коде java, база данных отклоняет значение. Может быть, вы забыли перенести вашу базу данных после удаления ограничения not null в вашем java коде?

...