Java 休眠一对多:实体应该包含外键还是整个对象

Java 休眠一对多:实体应该包含外键还是整个对象,java,hibernate,Java,Hibernate,我正在努力学习HibernateAPI。我很难处理人际关系以及如何利用人际关系 考虑下面的例子。 我们有两张桌子,主人和汽车。我们假设一辆汽车只能由一个人拥有,因此汽车与车主之间存在多对一的关系 现在,一个常规的SQL数据库应该是这样的 |------------| |------------| | Owner | 1 ------------------- N | Car | |------------|

我正在努力学习HibernateAPI。我很难处理人际关系以及如何利用人际关系

考虑下面的例子。 我们有两张桌子,主人和汽车。我们假设一辆汽车只能由一个人拥有,因此汽车与车主之间存在多对一的关系

现在,一个常规的SQL数据库应该是这样的

|------------|                         |------------|
|   Owner    | 1 ------------------- N |    Car     |
|------------|                         |------------|
|    id      |                         |     id     |
|    name    |                         |    model   |
|------------|                         |   car_id   |
                                       |------------|                 
现在最困难的部分是当我试图用Anotation写实体时

尤其是汽车实体

我的问题有两个:

1.汽车类实体应该有一个名为carId的长字段,还是应该是一个所有者字段

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 */

}
公车{
@Id私有int-Id;
@许多私人业主;
私有字符串模型;
/**接球手和接球手*/
}
公共类所有者{
@Id私有int-Id;
私有字符串名称;
@OneToMany私家车;
/**接球手和接球手*/
}

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

/*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;
}
/*与普通车车主的多对一关系*/
公车{
@身份证
私有int-id;
@许多酮
私人业主;
}
/*与同级别车主的一对多关系*/
公共类所有者{
@身份证
私有int-id;
@OneToMany(mappedBy=“所有者”)
私家车名单;
}

在提供的关系主实体中,实体是所有者。现实生活中,车主可以拥有多辆车。在这种情况下,每辆车都应该引用所有者(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;
}
公共类所有者{
@独身癖
私家车名单;
}
双向传输的示例:

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;
}
公共类所有者{
@OneToMany(mappedBy=“所有者”)
私家车名单;
}
公车{
@许多酮
私人业主;
}

我想
汽车
应该有一个
车主id
而不是
汽车id
。原因:我想你应该用它来表示外键,因为
Car
已经有
id
作为主键了。现在,我希望外键以外部实体命名,即
Owner
。整数ID是一种数据库黑客,用于加速查询,而不是对象模型的一级部分。对象模型中的关系是对象类型之间的关系,而不是它们的人工ID,如这里的答案所示。实体
equals
和相关方法(
hashCode
等)应根据对象的键值或数据库术语自然键编写。请再解释一下;您的答案主要是codeNote,
mappedBy
属性如何通知JPA/Hibernate,
Owner.cars
Car.Owner
的对应项,
cars
集合可以通过与正确的所有者收集所有
Car
实例来建立。