Синхронизация отношений сущностей JPA / Hibernate - PullRequest
0 голосов
/ 04 августа 2020

Ситуация:

  • У меня есть сущность 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) следующим образом:

  1. projectService.deleteProject() (там я вызываю project#removeFollower(f), а затем projectRepo#delete(project))
  2. теперь, если я снова запрошу свой userRepo для User f (или использую старый экземпляр), он говорит мне, что он все еще следует за проектом, который я только что удалил.

Есть ли что-то, чего мне не хватает, чтобы другая сторона отношения (последователи) получали обновление об удаленном проекте?

ОБНОВЛЕННОЕ НАБЛЮДЕНИЕ:

  • без явного Cascade.MERGE & PERSIST на стороне User (не владеющей) данные не синхронизируется c и даст EntityNotFoundException
  • , как только я добавлю каскадную информацию, я получу org.hibernate.PersistentObjectException: detached entity passed to persist: com.bla.bla.Project
...