2015-12-08 4 views
1

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

ответ

1

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