В чем разница между методом EntityManager.find() и настраиваемым запросом для выбора этого конкретного ввода данных?JPA не удалось сохранить запись с помощью ассоциации внешних ключей ManyToOne
У меня есть студенческая сущность, которая имеет ограничение внешнего ключа для объекта School через SCHOOL_ID. При сохранении новой записи студента JPA пытается вставить существующую школьную запись в таблицу SCHOOL, что приводит к исключениям целостности БД. Запись школы была добавлена к студенческой записи по ниже код:
student.setSchool(em.createNamedQuery("getSchoolByName", School.class).setParameter("name", schoolName).getSingleResult());
запрос
@NamedQueries({@NamedQuery(name="getSchoolByName", query="SELECT sc FROM School sc WHERE ts.name = :name")})
Существует единственное ограничение на поле имени школы, поэтому данное имя будет давать один результат для конечно.
Но если я использую метод find() для извлечения школьной записи через свой идентификатор (первичный ключ), такой проблемы нет.
student.setSchool(em.find(School.class, schoolId));
И таблица STUDENT, и SCHOOL принимают идентификатор как первичный ключ.
Внешний ключ ассоциации в классе Student лица выглядит
//uni-directional many-to-one association to TestSuite
@ManyToOne(targetEntity=School.class,cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="SCHOOL_ID", referencedColumnName="SCHOOL_ID", nullable=false, insertable=false, updatable=false)
private School school;