2015-11-07 67 views
1

我有三张桌子1)学生2)游戏和3)student_game。这里studentid是学生表的主键,gameid是游戏桌的主键。关联表有四列1) uuid 2) studentid 3) gameid 4) gametype如何使用Spring Data JPA获取关联表列?

我现在用的是弹簧数据的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())); 

现在我的问题是,

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

如何获取关联列值?

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

回答

2

你的映射是错误的:

  1. 你映射相同,双向多对多关联作为两个不同的一对多关联,但使用相同连接表。这可能会导致未定义的行为,因为您可能在同一个事务中从玩家中移除游戏,并将玩家添加到游戏中。
  2. 您不能将student_game表用作连接表:每次将游戏添加到玩家(反之亦然)时,由于Hibernate不知道uuid和gametype列的任何内容,因此它不会插入任何东西到这两列,这不是你想要的。

你需要什么待办事项是将student_game表映射为另一个实体。我们称之为戏剧。然后,一个Play有一个gameType,字段,一个用户有多个Plays;一场比赛有多场比赛。你当然可以使这两个OneToMany协会双向。

+0

谢谢您的建议。如果我删除关联表中的UUID字段和GameType字段,并在游戏表中添加gameType列,那么我的表关系会生成场景? – Vinod

+0

然后,您可以使用双向ManyToMany关联:http://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html_single/#d5e5588 –

相关问题