В чем разница между методом EntityManager.find() и настраиваемым запросом для выбора этой конкретной записи данных?
У меня есть объект Student, который имеет ограничение внешнего ключа для объекта 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;