JPA не удалось сохранить запись с ассоциацией внешнего ключа ManyToOne

В чем разница между методом 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;

person Ruifeng Ma    schedule 08.12.2015    source источник


Ответы (1)


Это оказалось проблемой контекста персистентности. На самом деле запрос был сделан новым менеджером сущностей, контекст которого отличается от контекста менеджера сущностей, обрабатывающего сохранение. После объединения в один менеджер объектов проблем больше не было. find() и настраиваемый запрос дают один и тот же результат.

person Ruifeng Ma    schedule 08.12.2015