JPA OneToMany отношение не заполняется автоматически? - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть простая связь OneToMany между Task и TaskError.

Task отображает TaskErrors:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "task", orphanRemoval = true)
private List<TaskError> taskErrorCollection;

TaskErrors следует удалять при удалении Task, следовательно, orphanRemoval.

TaskError подключен к Задаче:

@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Task task;

Список TaskErrors в Задаче не обновляется, когда я добавляю TaskError с этим кодом:

TaskError taskError;
// set all taskErrors vars
taskErrorDAO.create(taskError);

Так чтоВ базе данных есть строка для TaskError, а список TaskErrors в Task не заполняется.Очевидно, что когда я удаляю задачу, выдается ошибка: MySQLIntegrityConstraintViolationException: не удается удалить или обновить родительскую строку

Требуется ли мне лично заполнять список TaskError в Task?Есть ли способ, чтобы этот список автоматически заполнялся?Em.flush после taskErrorDAO.create (taskError) не помогает.

relation

1 Ответ

4 голосов
/ 23 ноября 2011

Разработчик несет ответственность за представление в памяти ваших отношений сущностей.Так что - да, вам необходимо заполнить экземпляр TaskError в списке Task TaskError.

Вы можете попробовать очистить кэш PersistenceContext для Task и заново извлечь егонепосредственно из базы данных, что-то вроде:

em.refresh(task);

или

em.clear();
task = em.find(Task.class, yourTaskId);

В любом случае, ваш поставщик JPA должен очистить представление вашей сущности в памяти, попасть в базу данных (что, как вы сказали, правильно вставил строку), чтобы извлечь ее и загрузить список правильно.Тем не менее, я бы не пошел этим путем в долгосрочной перспективе, а просто соответствующим образом обновил бы ссылки на мои объекты.
Если вы отказываетесь обновлять отношения ваших сущностей в памяти, вы не можете использовать функции кэширования PersistenceContext.Чтобы получить правильные данные, вам нужно будет обращаться к базе данных каждый раз, когда вы захотите использовать / извлечь вашу сущность Task после того, как ей будет назначен любой новый TaskError.

Еще одна вещь - почему у вас есть Cascade.ALL в TaskError?Вы хотите удалить Task экземпляр, если TaskError удален?

Вы также можете проверить этот ресурс для получения дополнительной информации.

...