Как использовать репозиторий Spring JPA для правильного сохранения объекта с внешним ключом? - PullRequest
0 голосов
/ 27 мая 2020

Я впервые работаю над проектом с Hibernate и Spring. Я решил использовать однонаправленное отображение, и это сработало довольно хорошо, за исключением одной вещи. Всякий раз, когда я пытаюсь сохранить событие с объектом EventType в нем. это дает мне следующую ошибку: java.sql.SQLException: Field 'type_id' doesn't have a default value

Я использую стандартную функцию репозитория JPA evenementRepository.save(evenement);

Вот как выглядит моя база данных:

enter image description here

это мой класс событий

@Entity
@Table(name = "evenement")
@EntityListeners(AuditingEntityListener.class)
public class Evenement {

@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String naam;

    private Date datum;

    private String status;

    private String beschrijving;

    private String locatie;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "type_id", nullable = false, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_3"))
    private Evenement_Type eventType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "template_id", nullable = true, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_2"))
    private Template template;
//getters and setters

это мой класс Event_Type:

@Entity
@Table(name = "evenement_type")
@EntityListeners(AuditingEntityListener.class)
public class Evenement_Type {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String naam;

    private String beschrijving;
//getters and setters

контроллер

@RestController
@RequestMapping("/")
public class EvenementController {

    @Autowired
    EvenementDAO evenementDAO;

    @PostMapping("/evenement")
    public Evenement createEvenement(@Valid @RequestBody Evenement evenement) {
            return evenementDAO.save(evenement);
    }

dao

как вы можете видеть, я дважды проверяю, имеет ли событие фактический event_type и имеет ли event_type идентификатор. я на 100% уверен, что проблема не в этом. он всегда имеет вывод в консоли.

@Service
public class EvenementDAO {
    @Autowired
    EvenementRepository evenementRepository;
    @Autowired
    Template_TaakDAO template_taakDAO = new Template_TaakDAO();
    @Autowired
    TaakDAO taakDAO = new TaakDAO();

    public Evenement save(Evenement evenement) {
        System.out.println(evenement.getEventType().getId());
        return evenementRepository.save(evenement);
    }

JSON объект, отправленный через почтальона

{
    "naam": "test-name",
    "datum": "2021-08-08",
    "status": "test-status",
    "beschrijving": "test-description",
    "locatie": "test-location",
    "eventType": {
        "id": 1,
        "naam": "test-name",
        "beschrijving": "test-description"
    },
    "template": null
}

есть еще один класс, который использует Event_Type в качестве внешнего ключа, который также не ' т работать. все остальные классы с внешними ключами у меня нет проблем с сохранением. Я почти уверен, что это либо отображение, либо что-то в моей базе данных, но я не могу понять, что именно. Мне жаль, что большая часть моего кода написана на моем родном языке, это действительно плохая привычка (все, что вам нужно знать, это то, что событие означает событие).

пожалуйста, помогите, я застрял на долгие годы. если я забыл опубликовать важную информацию, скажите об этом.

1 Ответ

0 голосов
/ 27 мая 2020

Исключение говорит, что вы пытаетесь сохранить NULL в поле 'type_id', но у вас есть ненулевое ограничение в db и нет значения по умолчанию.

Обратите внимание на эту часть:

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "type_id", nullable = false, insertable = false, updatable = false, foreignKey = @ForeignKey(name = "evenement_ibfk_3"))
    private Evenement_Type eventType;

Вы определили отображение для поля type_id , но оно не отображается в целевой модели сущности. Вы должны добавить его в модель Evenement и заполнить существующие записи БД, чтобы устранить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...