使用单独的 OneToMany 创建 ManyToMany Join table
Using seperate OneToManys to create a ManyToMany Join table
我有 2 个模型 User
和 Exercise
。现在任何 User
都可以有任何 Exercise
。这是 ManyToMany
的情况。我用 @ManyToMany
对它建模,但你不能在 ManyToMany
中有重复的条目。用户可能会做多组练习,因此我需要重复输入。为了解决这个问题,我创建了单独称为 UserExerciseJoin
的连接 table。 User 和 Exercise 与 UserExerciseJoin
模型有 ManyToOne
关系。虽然这解决了我现在无法从新 table 中删除的多键问题。我从与 Exercise
.
关联的一些模型中得到 OptimisticLockException
我的问题是:我在单独 table 的道路上是否正确,或者我可以对标准 @ManyToMany
做些什么来制作它接受重复条目吗?
如果我在你的模型中理解正确,那么是的,@ManyToMany 可能并非如此。在我看来,使用 有意义的实体 会更好,例如 UserExerciseOccurrence
,它同时引用 User
和 Exercise
并且表示具体运动会。
如果您需要保存有关特定锻炼会话的更多信息(如持续时间等),您也可以从这种方法中受益。
@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.DELETE
或 CascadeType.ALL
级联,则会导致删除相关实体。所以你不应该在 UserExercise
class 中设置级联。然后删除这样的实体不会造成问题。
我有 2 个模型 User
和 Exercise
。现在任何 User
都可以有任何 Exercise
。这是 ManyToMany
的情况。我用 @ManyToMany
对它建模,但你不能在 ManyToMany
中有重复的条目。用户可能会做多组练习,因此我需要重复输入。为了解决这个问题,我创建了单独称为 UserExerciseJoin
的连接 table。 User 和 Exercise 与 UserExerciseJoin
模型有 ManyToOne
关系。虽然这解决了我现在无法从新 table 中删除的多键问题。我从与 Exercise
.
OptimisticLockException
我的问题是:我在单独 table 的道路上是否正确,或者我可以对标准 @ManyToMany
做些什么来制作它接受重复条目吗?
如果我在你的模型中理解正确,那么是的,@ManyToMany 可能并非如此。在我看来,使用 有意义的实体 会更好,例如 UserExerciseOccurrence
,它同时引用 User
和 Exercise
并且表示具体运动会。
如果您需要保存有关特定锻炼会话的更多信息(如持续时间等),您也可以从这种方法中受益。
@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.DELETE
或 CascadeType.ALL
级联,则会导致删除相关实体。所以你不应该在 UserExercise
class 中设置级联。然后删除这样的实体不会造成问题。