使用单独的 OneToMany 创建 ManyToMany Join table

Using seperate OneToManys to create a ManyToMany Join table

我有 2 个模型 UserExercise。现在任何 User 都可以有任何 Exercise。这是 ManyToMany 的情况。我用 @ManyToMany 对它建模,但你不能在 ManyToMany 中有重复的条目。用户可能会做多组练习,因此我需要重复输入。为了解决这个问题,我创建了单独称为 UserExerciseJoin 的连接 table。 User 和 Exercise 与 UserExerciseJoin 模型有 ManyToOne 关系。虽然这解决了我现在无法从新 table 中删除的多键问题。我从与 Exercise.

关联的一些模型中得到 OptimisticLockException

我的问题是:我在单独 table 的道路上是否正确,或者我可以对标准 @ManyToMany 做些什么来制作它接受重复条目吗?

如果我在你的模型中理解正确,那么是的,@ManyToMany 可能并非如此。在我看来,使用 有意义的实体 会更好,例如 UserExerciseOccurrence,它同时引用 UserExercise 并且表示具体运动会。

如果您需要保存有关特定锻炼会话的更多信息(如持续时间等),您也可以从这种方法中受益。

@Entity
class UserExerciseOccurrence {
   @ManyToOne
   User user;

   @ManyToOne
   Exercise exercise;
}

@Entity
class User {
   @OneToMany(mappedBy="user", cascade=DELETE)
   Set<UserExerciseOccurrence> exerciseOccurrences;
}

@Entity
class Exercise {
   @OneToMany(mappedBy="exercise", cascade=DELETE)
   Set<UserExerciseOccurrence> exerciseOccurrences;
}

你走在正确的道路上。您应该从 User class 和 Excercise class 到这个新实体有 @OneToMany 关系。在 UserExerciseJoin 中你应该有 @ManyToOne 关系。
所以这段代码应该是这样的:

@Entity
User {
    @OneToMany(mappedBy="user")
    private List<UserExercise> userExercises;

    ....
}

@Entity
Excercise {
    @OneToMany(mappedBy="excercise")
    private List<UserExercise> userExercises;

    ....
}

@Entity
UserExercise
{
    @ManyToOne
    private User user;

    @ManyToOne
    private Excercise excercise;

    ...
}

您在删除这个新实体时出错。你参与了一些与运动相关的活动。看来这是因为级联。您可能在 UserExerciseJoin class 的字段上设置了级联。如果是 CascadeType.DELETECascadeType.ALL 级联,则会导致删除相关实体。所以你不应该在 UserExercise class 中设置级联。然后删除这样的实体不会造成问题。