Java - JPQL-запрос для удаления отношения oneToMany - PullRequest
0 голосов
/ 15 апреля 2011

Если у меня есть 3 объекта:

@ Публичный класс сущности Student {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

private String name; 

}

@ Entity @Inheritance (стратегии = InheritanceType.ПРИСОЕДИНЕНО) открытый класс Course {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

@OneToMany
private List<Student> students;

private String name; 

}

@ Entity @Inheritance (стратегии = InheritanceType.JOINED) открытый класс Группа {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;

@OneToMany
private List<Student> students;

private String name; 

}

Как я могу удалить учеников с помощью запроса JPQL?

Я пытаюсь

УДАЛИТЬ ИЗ СЛУЖЕБА С ГДЕ s.name = "John Doe"

Но у меня есть

Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (database, CONSTRAINT FK_course_student_students_ID FOREIGN KEY (students_ID) ССЫЛКИ student (ID))

Мне нужно сделать это в чистом JPQL для производительности, я не могу сделать entity.remove, потому что у меня есть 10000 Джона Доу, и мне нужно удалить их за секунду.

Почему JPQL не говорит: «Эй, давайте удалим этого Джона Доу из этого курса биологии, он не существует» вместо «Эй, курс биологии настолько важен, что ни один студент не можетНельзя удалить из этого курса!"

Чего мне не хватает и какую аннотацию мне нужно использовать?

Спасибо!

Редактировать: добавление @JoinColumn в отношение OnToMany может работать, если толькостуденты ссылаются на разные таблицы ...

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

По умолчанию однонаправленное отношение «один ко многим» отображается через таблицу соединений.Если у вас нет особых требований к использованию join talbe, вы можете вместо этого использовать внешний ключ в Student, его можно настроить следующим образом:

@OneToMany 
@JoinColumn
private List<Student> students; 

Это также должно решить вашу проблему с нарушением ограничений.

0 голосов
/ 06 июня 2011

Иногда вы можете очистить ссылки на объекты, которые удаляются в удаленных пользователях, используя запрос обновления всех.

Вы также можете настроить ограничение базы данных для каскадного или нулевого при удалении, чтобы избежать проблем с ограничениями.

...