@OneToMany和@ManyToOne

时间:2016-05-16 15:34:53

标签: java spring hibernate annotations

我需要解决这个问题:

@Entity
public class Team
{

    @OneToMany // how mapped it ?
    private List<Match> matches; // all played and coming matches
}

@Entity
public class Match
{

    @ManyToOne
    @Column( nullable = false )
    private Team teamA;

    @ManyToOne
    @Column( nullable = false )
    private Team teamB;
}

如果我有Team team;之类的字段,那么使用mappedBy = team;会更容易。

我可以使用List团队而不是两个字段并添加@ManyToMany注释,但这不是一个好的解决方案imho。

3 个答案:

答案 0 :(得分:0)

假设您的Match表具有Team表的team_id(外键)主键。此代码可能对您有所帮助。 tam有很多比赛,很多球队都与一场比赛相关联。

在您的团队实体中:

@OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
List<Match> matches= []

在您的匹配实体中:

@ManyToOne
@JoinColumn(name = "TEAM_ID")
Team team

答案 1 :(得分:0)

事实上,许多比赛可以与一个球队相关联,并且许多球队(正好2个)可以与比赛相关联。

由于你想要一个包含所有匹配项的列表,而团队没有在团队中分成两个映射(对于A或B),我建议你在它们之间使用@ManyToMany关系映射。

答案 2 :(得分:0)

你的问题在于你需要记住,有些比赛是在家里和#34;有些比赛是&#34;远离#34;像homeTeamawayTeam一样考虑它会比teamAteamB更容易。

每个小组将有一组OneToMany主场比赛和另外一组OneToMany用于客场比赛。然后,如果需要,您可以添加一个方便的方法来获取所有匹配。

@Entity
public class Team {

    @OneToMany(mappedBy="homeTeam")
    private Set<Match> homeMatches = new HashSet<>(); 

    @OneToMany(mappedBy="awayTeam")
    private Set<Match> awayMatches = new HashSet<>(); 

    // getters and setters


    // special getter if you want it
    public Set<Match> getAllMatches() {
        Set<Match> allMatches = new HashSet<>(); 
        allMatches.addAll(homeMatches);
        allMatches.addAll(awayMatches);
        return allMatches;
    }

}

@Entity
public class Match {

    @ManyToOne
    @JoinColumn(name = "HOME_TEAM_ID", referencedColumnName = "TEAM_ID")
    private Team homeTeam;

    @ManyToOne
    @JoinColumn(name = "AWAY_TEAM_ID", referencedColumnName = "TEAM_ID")
    private Team awayTeam;
}