Ситуация:
- У меня есть сущность
Project
, имеющая отношение к User
:
@Entity
@Table
public class Project {
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinTable(name = "FOLLOWS",
joinColumns = {@JoinColumn(name = "PROJECT_ID")},
inverseJoinColumns = {@JoinColumn(name = "USER_ID")})
private Set<User> followers = new HashSet<>();
public void removeFollower(User user) {
if (followers.contains(user)) {
user.getProjectsFollowed().remove(this);
followers.remove(user);
}
}
... (getters, setters, equals, hashCode)
}
- my
ProjectService
содержит метод deleteProject
@Service
public class ProjectService {
@Transactional
public void deleteProject(Project project) {
project.getFollowers().forEach(project::removeFollower);
projectRepo.delete(project);
}
}
- также мой
ProjectRepository
:
@Repository
public interface ProjectRepository extends JpaRepository<Project, BigDecimal> {}
- с другой стороны, у меня есть
User
, объявляющий отношение к Project
:
@Entity
@Data
public class User {
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "followers")
private Set<Project> projectsFollowed = new HashSet<>();
... (getters, setters, equals, hashCode)
}
Теперь я то, что в основном вызывает проблему, когда я пытаюсь удалить Project
(имеющий последователя f
) следующим образом:
projectService.deleteProject()
(там я вызываю project#removeFollower(f)
, а затем projectRepo#delete(project)
) - теперь, если я снова запрошу свой
userRepo
для User f
(или использую старый экземпляр), он говорит мне, что он все еще следует за проектом, который я только что удалил.
Есть ли что-то, чего мне не хватает, чтобы другая сторона отношения (последователи) получали обновление об удаленном проекте?
ОБНОВЛЕННОЕ НАБЛЮДЕНИЕ:
- без явного
Cascade.MERGE & PERSIST
на стороне User
(не владеющей) данные не синхронизируется c и даст EntityNotFoundException
- , как только я добавлю каскадную информацию, я получу
org.hibernate.PersistentObjectException: detached entity passed to persist: com.bla.bla.Project