Слияние данных с отношением OneToMany - PullRequest
0 голосов
/ 10 января 2019

У меня есть две сущности с отношениями OneToMany

Resource.java

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL}, mappedBy="resource", orphanRemoval = true)
private Set<Skills> skills = new HashSet<Skills>();

, а другой объект - Skills.java

@Id
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "RESOURCE_CODE", unique = false, nullable = false, foreignKey = @ForeignKey(name = "fk_resource_primary_skills_map_resource_code"))
@Audited(withModifiedFlag = true, targetAuditMode = RelationTargetAuditMode.NOT_AUDITED, modifiedColumnName = "RESOURCE_CODE_MOD")
private Resource resource;

Я бы добавил / обновил / удалил навыки ресурса за один раз. для этого я пытаюсь очистить все существующие навыки и добавив новый набор навыков

resourceObject.getSkills().clear();
resourceObject.getSkills().addAll(skills);

добавить / удалить работают нормально. но обновление не работает. я вижу ниже исключение

 a different object with the same identifier value was already associated with the session

Я попробовал entityManager.flush и новые транзакции, но ничего не помогло

1 Ответ

0 голосов
/ 11 января 2019

Мне удалось сделать это путем обновления существующего набора вместо очистки всех вещей. Это добавило множество циклов if.

Основная причина в том, что дочерний объект не имеет автоматически сгенерированного первичного ключа, его уникальный ключ основан на данных. Таким образом, в соответствии с операцией очистки, вставка происходит перед удалением. поэтому уникальный идентификатор уже существует для операции, которую мы выполняем (какой бы порядок мы ни выполняли, например сначала удалить, затем вставить следующую).

Два решения 1) добавить первичный ключ (который будет отличаться для вновь добавленных объектов) ИЛИ ЖЕ 2) Обновить существующие дочерние объекты (не добавляя новых дочерних)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...