Получение «Объект ссылается на несохраненный временный экземпляр» вместо «исключение ограничения внешнего ключа» для поля внешнего ключа с возможностью обнуления

#jpa #kotlin #foreign-keys

#jpa #kotlin #foreign-keys

Вопрос:

У меня есть объект A, который имеет поле внешнего ключа с возможностью обнуления ‘field1’, которое ссылается на первичный ключ объекта B. Если я делаю запрос post со значением поля, которого нет в сущности B.Я ожидаю исключения внешнего ключа, вместо этого я получаю объект, ссылающийся на несохраненное исключение переходного экземпляра. Если ‘field1’ задано как notnull, ожидается, что для foreignkey появится исключение. Хотел узнать, какова связь между обнуляемым полем и ограничением внешнего ключа

Пробовали с

 1)      @ManyToOne(cascade = arrayOf(CascadeType.All))
        @JoinColumn(name ="book",referencedColumnName ="book_id")
        var book: Book? = null,

when I am giving this..instead of checking foreign key constraint, it was trying to add book entity also into DB

2)      @ManyToOne(cascade = arrayOf(CascadeType.All))
        @JoinColumn(name ="book",referencedColumnName ="book_id",nullable=true, insertable=false,updatable=false)
        var book: Book? = null,

3)      @ManyToOne(optional=false,fetch=FetchType.EAGER)
        @JoinColumn(name ="book",referencedColumnName ="book_id")
        var book: Book? = null,

4)      @ManyToOne(optional=false,fetch=FetchType.LAZY)
        @JoinColumn(name ="book",referencedColumnName ="book_id")
        var book: Book? = null,


But whatever I try I am getting the same transientobject exception ..only if the field "book" was given a not null constraint in db, it is throwing foreign key exception.
  
 please find the code
    @Entity
    @Table(name ="student")
    class Student(

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    var id: Long? = -1,

    @ManyToOne()
    @JoinColumn(name ="book",referencedColumnName ="book_id")
    var book: Book? = null,
        )


    @Entity
    @Table(name ="book")
    class Book(

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    var book_id: Long? = -1

    )
  

Исключение :
«не удалось выполнить инструкцию; SQL [n / a]; ограничение [book]; вложенным исключением является org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию»

На самом деле получение: «org.hibernate.Исключение TransientPropertyValueException: свойство Not-null ссылается на переходное значение — переходный экземпляр должен быть сохранен перед текущей операцией: Student .book -> Book; вложенным исключением является java.lang.Исключение IllegalStateException: org.hibernate.Исключение TransientPropertyValueException: свойство Not-null ссылается на переходное значение — переходный экземпляр должен быть сохранен перед текущей операцией: Student .книга -> Книга

Комментарии:

1. Можете ли вы показать мне код, который сохраняет ученика?

2. ` fun createStudent(студент: com.test.model. Студент): com.test.model. Student { возвращает buildStudent(this.studentRepository.save(com.test. Сущность. Студент (stduent.id , студент.книга))) }` Репозиторий реализован с помощью jpa ` import org.springframework.data.jpa.repository.* интерфейс StudentRepository: JpaRepository<Student, Int> }`