В настоящее время я использую Hibernate в проекте, и у меня возникли проблемы с настройкой отношения «Множество к многим». Я думаю, что моя проблема связана с типами Cascade.Спящий режим для многих типов каскадных типов
Сценарий: у нас есть объявление, и у каждого объявления может быть много тегов, но каждый тег может быть связан со многими рекламными объявлениями. ManyToMany аннотация рекламной сущности является:
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "adMediaAdvertiserTag",
joinColumns = { @JoinColumn(name = "adMediaId") },
inverseJoinColumns = { @JoinColumn(name = "advertiserTagId") })
И отображение ManyToMany на тег объекта является:
@ManyToMany(mappedBy = "advertiserTags", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
Я вижу две различных ошибки в зависимости от конфигурации и типа каскада и, если тег уже существует в базе данных.
Если каскадного типа на объявлении не включает PERSIST и тег не существует, то мы получим это исключение:
TransientObjectException: object references an unsaved transient instance
И если каскадного типа на объявлении действительно включает PERSIST и тег уже существует, мы получим:
PersistentObjectException: detached entity passed to persist
единственный способ, которым я могу получить эту работа не имеет PERSIST как каскадный тип, но проходной каждый тег и сохранить их на сессию.
Правильно ли это? Есть ли способ, с помощью которого hibernate может автоматически обрабатывать это для меня?
Дайте мне знать, если это не ясно или вам нужна дополнительная информация.
UPDATE
Я спасаю объектов с использованием сервиса, который использует метод Сохраните CrudRepository объект springframework. Существует много кода, поэтому я не могу опубликовать его полностью.
В настоящее время я не использую метод merge или persist для любого объекта, который я пытаюсь сохранить. Я был под впечатлением, что Hibernate справится с такими вещами для меня.
Так вы говорите, что некоторые из тегов уже могут существовать там, где некоторые из них являются новыми и нуждаются в сохранении. Если это так, разве это не призыв к 'объединению' вместо метода' persist'? –
Да, это правильно. Я пробовал это, но когда добавлен новый тег, он возвращает TransientObjectException: объект ссылается на несохраненный экземпляр переходного процесса –
Вы имеете в виду CascadeType или метод, используемый для сохранения объекта? –