У меня есть две сущности: 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)));
Что я делаю не так?