使用单独的一对多来创建多对多联接表

时间:2015-01-16 23:57:03

标签: mysql postgresql jpa playframework ebean

我有2个模型UserExercise。现在任何User都可以有Exercise。这是ManyToMany的情况。我使用@ManyToMany对其进行了建模,但您在ManyToMany中无法重复输入。用户可能会进行多组练习,因此需要重复输入。为了解决这个问题,我创建了一个名为UserExerciseJoin的连接表。用户和练习与ManyToOne模型有UserExerciseJoin个关系。虽然这解决了多键问题,但我现在无法从新表中删除。我从与OptimisticLockException相关联的某些模型中获得Exercise

我的问题是:我是否在正确的路径上使用单独的表格,或者我可以对标准@ManyToMany做些什么来让它接受重复的条目?

2 个答案:

答案 0 :(得分:2)

如果我在你的模型中理解它,那么是的,对于@ManyToMany来说可能不是这样。在我看来,你可以通过引用UserExerciseOccurrenceUser的{​​{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.DELETECascadeType.ALL级联,则会导致删除相关实体。所以你不应该在UserExercise类中设置级联。然后删除这样的实体不会导致问题。