当前位置: 首页 > 面试题库 >

在JPA / Hibernate中建立一对多关系模型

谢灵均
2023-03-14
问题内容

我有以下实体关系问题。一个“游戏”必须有两个(只有两个)“团队”对象。一个“团队”可以有很多“游戏”

据我所知,这是一对多关系。但是…我不知道如何在JPA中对此建模。例如,我打算做这样的事情…

@Entity
public class Team extends BaseObject {
  private Long id;
  private Set<Game> games;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO) 
  public Long getId() {return id;}
  public void setId(Long id) {this.id = id;}

  @OneToMany(mappedBy = "game")
  public Set<Game> getGames() {return games;}
  public void setGames(Set<Game> games) {this.games = games;}
}

@Entity
public class Game extends BaseObject {
  private Long id;
  private Team team1;
  private Team team2;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO) 
  public Long getId() {return id;}
  public void setId(Long id) {this.id = id;}

  @ HERE IS THE PROBLEM - WHAT ANNOTATION DO I USE?
  public Team getTeam1() {return team1;}
  public void setTeam1(Team team1) {this.team1 = team1;}

  @ HERE IS THE PROBLEM - WHAT ANNOTATION DO I USE?
  public Team getTeam2() {return team2;}
  public void setTeam2(Team team1) {this.team2 = team2;}
}

但是,正如您所看到的,我不确定如何从注释侧将表链接在一起。有人曾经做过这样的事情吗?有什么想法吗?

非常感谢!


问题答案:

我希望有人能提出一个很棒的解决方案,但是这是一个棘手的情况,我从未能找到一种很好的映射方法。您的选择包括:

  1. 更改关系建模的方式。例如,您可能会遇到以下情况:
    @Entity
    

    public class GameMembership {
    Team team;
    Game game;
    int gamePosition; // If tracking Team 1 vs Team 2 matters to you
    }


然后Game有一个Collection<GameMembership>,即您将其建模为多对多。Game仍然可以使用方便的方法来设置团队1和团队2,等等(业务逻辑来强制只有2个团队,但是已经完成了),但是它们映射回Collection了Hibernate所使用的。

  1. 放弃建立双向关系-选择一个方向(GameTeam似乎最合适),然后仅打na该关系。找到所涉及的Gamesa Team然后就可以从您的DAO等中进行操作,而不是从其Team本身可以访问的内容中进行操作:
    public class GameDAO {
    ....
    public Collection<Game> gamesForTeam(Team t) {
         ....
         Query q = session.createQuery("FROM Game WHERE team1 = :team OR team2 = :team");
         q.setParameter("team", t);
         return q.list();
    }
    

    }

或类似的东西

  1. 继续沿您所走的路线行驶,但最后会“作弊” TeamGame侧面的属性应映射为正常的多对一关系;然后mappedByTeam末尾用来表示Game“控制”关系。
    public class Team {
        ...
        @OneToMany(mappedBy="team1")
        private Set<Game> team1Games;
        @OneToMany(mappedBy="team2")
        private Set<Game> team2Games;
    

有一个简便属性为您的API(team1Gamesteam2Games只是对Hibernate的使用):

        @Transient
    public Set<Game> getGames() {
        Set<Game> allGames = new HashSet<Game>(team1Games);
        allGames.addAll(team2Games);
        // Or use google-collections Sets.union() for bonus points
        return allGames;
    }

因此对于您的班级的调用者来说,有2个属性是透明的。



 类似资料:
  • 我正在尝试使用Hibernate/Jpa建立一对多关系。 当前我遇到以下异常: 退款交易。java这是父类 ItemRefundDetail.java这是子类。 我知道我在@OneToMany或@manytone注释中犯了一些错误。 更新:我在db、refund_transaction和item_refund_detail中只有2个表。我没有任何名为refund_transaction_item_

  • 问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?

  • 问题内容: 在关系数据库中,我有一个用户表,一个类别表和一个用户类别表,它们之间存在多对多关系。在Redis中具有这种结构的更好形式是什么? 问题答案: 使用Redis,关系通常由集合表示。一组可用于表示单向关系,因此每个对象需要一组以表示多对多关系。 尝试将关系数据库模型与Redis数据结构进行比较是毫无用处的。使用Redis,所有内容均以非规范化方式存储。 例: 一旦有了此数据结构,就可以使用

  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段

  • 如果在中只有一组,这将非常好地工作。ASSESSMENT_COMMENT只有两列: 它将完美地代表一对多的关系。 现在问题来了: 那么,1)这是Hibernate中已知的bug吗?2)有办法解决这个问题吗?我可以强制Hibernate创建两个映射表,每个映射表一个吗?请记住,我不能更改类来引用(业务逻辑需求)

  • 我目前在数据库中的一对一/多对一映射时遇到问题。我希望我的图书表具有与“出版商”、“流派”、“评级”和“状态”表的@ManyToOne映射。 这是我的Book实体类的外观: 例如,我的Publisher实体类(类型、评级和状态类完全相同): 唯一的区别是类型、评级和状态的书籍字段,f. e: 这就是我的堆栈跟踪的样子: 更新的堆栈跟踪: