Как использовать каскад в Hibernate ManyToMany для пропуска дубликатов? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть две сущности: Tag и Topi c. Они имеют отношение многие ко многим (таблицы: теги, темы, tags_topics). Мне нужны следующие правила:

  • при сохранении топи c - теги тоже сохраняются.
  • при сохранении следующих топи c с такими же тегами (ями) - topi c сохранено, но теги, которые уже существуют, не сохраняются, а в tags_topics сохраняются новые отношения.
  • при удалении topi c - теги не удаляются.

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    @JoinTable(
            name = "tags_topics",
            joinColumns = {@JoinColumn(name = "topic_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "tag_id", referencedColumnName = "id")}
    )
    private Set<Tag> tags = new HashSet<>();
    @ManyToMany(mappedBy = "tags")
    private Set<Topic> topics = new HashSet<>();

Если я пытаюсь создать новую топи c с тем же тегом, я получаю duplicate key value violates the uniqueness constraint of tags_name_key.

Когда я использую CascadeType.MERGE:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

, тогда я делаю:

cascade = {CascadeType.PERSIST, CascadeType.MERGE}

И снова duplicate key value violates the uniqueness constraint of tags_name_key.

мой пример запроса http POST:

{
  "subject": "ManyToMany",
  "url": "https://stackoverflow.com/questions/ask",
  "description": "Code",
  "readStatus": false,
  "tags": [
    {
      "name": "jpa"
    },
    {
      "name": "manytomany"
    }
  ]
}

код сохранения:

public TopicDto saveTopic(TopicDto dto){
    return topicMapper.toDto(repository.save(topicMapper(toEntity(dto)));

Что я делаю не так?

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