【问题标题】:Hibernate one to many: Should the entity contain the foreign key or the whole object一对多休眠:实体应该包含外键还是整个对象
【发布时间】:2017-06-01 21:37:59
【问题描述】:

我正在尝试学习休眠 api。我很难处理人际关系以及应该如何使用它们。

考虑以下示例。 我们有两张表,Owners 和 Cars。我们假设一辆汽车只能由一个人拥有,因此汽车与车主是多对一的关系。

现在一个普通的 SQL 数据库应该是这样的。

|------------|                         |------------|
|   Owner    | 1 ------------------- N |    Car     |
|------------|                         |------------|
|    id      |                         |     id     |
|    name    |                         |    model   |
|------------|                         |   car_id   |
                                       |------------|                 

当我尝试使用注释来编写实体时,困难的部分就来了。

尤其是 Car 实体。

我的问题有两个:

1.汽车类实体应该有一个叫carId的long字段还是应该是Owner owner字段?

2.我还应该在两个实体中包含一对多和多对一关系还是只需要一个。

提前谢谢你。

【问题讨论】:

  • 我认为Car 应该有一个owner_id 而不是car_id。原因:我想你想用它来表达外键,因为Car 已经有id 作为主键。现在,我希望外键以外部实体命名,即Owner
  • 整数 ID 是一种用于加快查询速度的数据库技巧,而不是对象模型的一流部分。对象模型中的关系是对象类型之间的关系,而不是它们的人工 ID,如这里的答案所示。实体equals 和相关方法(hashCode 等)应根据对象的键值或数据库术语自然键来编写。

标签: java hibernate


【解决方案1】:

你们应该有双向关系,比如:

/*Many to one relationship with owner in class Car*/
public class Car {
  @Id 
  private int id;

  @ManyToOne 
  private Owner owner;

}

/*One to many relationship with car in class Owner*/

public class Owner {
  @Id 
  private int id;

  @OneToMany(mappedBy="owner") 
  private List<Car> cars;
}

【讨论】:

  • 请多解释一下;你的答案主要是代码
  • 注意,mappedBy 属性如何通知 JPA/Hibernate,Owner.carsCar.owner 的对应物,cars 集合可以通过收集所有 @987654326 来建立@ 具有正确所有者的实例。
【解决方案2】:

所以你应该使用 Owner 作为类型,如果你想访问一个所有者的汽车和汽车的所有者,你必须在这两个类中设置关系。

public class Car {
  @Id private int id;
  @ManyToOne private Owner owner;
  private String model;
  /** getters and setters */

}


public class Owner {
  @Id private int id;
  private String name;
  @OneToMany private List<Car> cars;

  /** getters and setters */

}

【讨论】:

    【解决方案3】:

    在提供的关系中,主实体是所有者。作为现实生活中的示例,所有者可以拥有多辆汽车。在这种情况下,每辆车都应该引用所有者 (owner_id),或者您可以使用关系表。您可以指定单向映射或双向映射。

    单向示例:

    public class Owner {
        @OneToMany
        private List<Car> cars;
    }
    

    双向示例:

    public class Owner {
    
        @OneToMany(mappedBy = "owner")
        private List<Car> cars;
    }
    
    public class Car {
        @ManyToOne
        private Owner owner;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2013-05-27
      • 2010-09-17
      • 1970-01-01
      • 2015-03-10
      • 2012-02-05
      相关资源
      最近更新 更多