我有2个模型User
和Exercise
。现在任何User
都可以有Exercise
。这是ManyToMany
的情况。我使用@ManyToMany
对其进行了建模,但您在ManyToMany
中无法重复输入。用户可能会进行多组练习,因此需要重复输入。为了解决这个问题,我创建了一个名为UserExerciseJoin
的连接表。用户和练习与ManyToOne
模型有UserExerciseJoin
个关系。虽然这解决了多键问题,但我现在无法从新表中删除。我从与OptimisticLockException
相关联的某些模型中获得Exercise
。
我的问题是:我是否在正确的路径上使用单独的表格,或者我可以对标准@ManyToMany
做些什么来让它接受重复的条目?
答案 0 :(得分:2)
如果我在你的模型中理解它,那么是的,对于@ManyToMany来说可能不是这样。在我看来,你可以通过引用UserExerciseOccurrence
和User
的{{1>}之类的有意义的实体更好,并且意味着具体的锻炼课程。
如果您需要保存有关特定锻炼课程的更多信息(如持续时间等),您也可以从这种方法中受益。
Exercise
答案 1 :(得分:1)
你走在正确的道路上。您应该从@OneToMany
类和User
类与此新实体之间存在Excercise
关系。在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类的字段上设置了级联。如果是CascadeType.DELETE
或CascadeType.ALL
级联,则会导致删除相关实体。所以你不应该在UserExercise
类中设置级联。然后删除这样的实体不会导致问题。