Прежде всего, пожалуйста, измените:
cascade=CascadeType.ALL
до:
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
, поскольку CascadeType.REMOVE автоматически наследуется при использовании CascadeType.ALL, но удаление сущностей применяется не только к таблице ссылок, но и к другой стороне ассоциации. ( см. Слышать )
поэтому попробуйте этот код:
@ManyToMany(mappedBy = "posts",
cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<Tag> tags;
@ManyToMany(cascade =
{CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "post_tag",
joinColumns = {
@JoinColumn(
name = "tag_id",
referencedColumnName = "id"
)
},
inverseJoinColumns = {
@JoinColumn(
name = "post_id",
referencedColumnName = "id"
)
}
)
private List<Post> posts;
но ваша проблема ....
вы пытаетесь сохранить отдельный объект ((означает, что экземпляр этого объекта был сохранен в БД, но этот объект не находится в сеансе)) в БД с помощью методов persist:
Post post = new Post();
post.setId(j);
.
.
.
em.persist(post)
Метод persist предназначен для добавления экземпляра new entity (без установки идентификатора к нему) в контекст постоянства, то есть для перехода экземпляра из переходного состояния в постоянное состояние.
Обычно мы вызываем его, когда хотим вставить запись в базу данных (сохранить экземпляр сущности)
так
если ваш объект имеет переходное или постоянное состояние, вы можете использовать метод persist, но если ваш объект был отсоединен до того, как вы использовали метод слияния, чтобы сохранить его