如何使用Spring Data JPA获取关联表列?

时间:2015-11-07 16:05:06

标签: spring hibernate spring-mvc jpa spring-data

我有三张桌子1)学生2)游戏和3)student_game。这里studentid是学生表的主键,gameid是游戏表的主键。关联表有四列1) uuid 2) studentid 3) gameid 4) gametype

我正在使用spring数据jpa,所以我的学生实体类的关系如下,

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "student_game", joinColumns = @JoinColumn(name = "studentid"), inverseJoinColumns = @JoinColumn(name = "gameid"))
private Set<Game> GameSet;

游戏实体具有以下关系,

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "student_game", joinColumns = @JoinColumn(name = "gameid"), inverseJoinColumns = @JoinColumn(name = "studentid"))
private Set<Student> studentSet;

在我的业务层,我可以使用以下逻辑获取相应学生的游戏名称集,

Student s = studentRepository.findOne(1L);
Set<Game> games= dd.getGamesSet();
games.forEach(game-> System.out.println(game.getGameId() + " : " + game.getGameName()));

现在我的问题是,

我需要通过将输入作为学生ID传递来从关联表(student_game)中获取gameType列值。

如何获取关联列值?

请建议获取关联表列值的最佳方法。

1 个答案:

答案 0 :(得分:2)

您的映射错误:

  1. 您将相同的双向ManyToMany关联映射为两个不同的OneToMany关联,但使用相同的连接表。这可能会导致未定义的行为,因为您可能会在同一事务中从播放器中删除游戏,并将玩家添加到游戏中。
  2. 您不能将student_game表用作连接表:每次将游戏添加到播放器(反之亦然)时,由于Hibernate对uuid和gametype列一无所知,因此不会在这两列中插入任何内容,这不是您想要的。
  3. 您需要做的是将student_game表映射为另一个实体。我们称之为Play。然后,Play有一个gameType,field,一个User有多个Plays;一场比赛有多场比赛。当然,您可以将这两个OneToMany关联双向化。