为什么hibernate对这些类使用连接表?
@Entity
public class CompanyImpl {
@OneToMany
private Set<Flight> flights;
@Entity
public class Flight {
我既不想要连接表也不想要双向关联:(
为什么hibernate对这些类使用连接表?
@Entity
public class CompanyImpl {
@OneToMany
private Set<Flight> flights;
@Entity
public class Flight {
我既不想要连接表也不想要双向关联:(
因为这就是它的设计方式,以及 JPA 规范告诉它映射这种关联的方式。如果您想在 Flight 表中添加一个连接列,请使用
@Entity
public class CompanyImpl {
@OneToMany
@JoinColumn(name = "company_id")
private Set<Flight> flights;
}
这是记录在案的。
Hibernate 使用关联表来映射关系,而另一个多方表不存在任何表。然后它将创建一个映射器。
该文档指出,使用 @OneToMany 和 @ManyToMany 您可以映射关联实体的集合、列表、映射和集合。
如果您没有指定@joincolumn,这是关于您的问题,使用连接表的单向一对多。表名是所有者表名、_ 和另一侧表名的串联。引用所有者表的外键名称是所有者表、_ 和所有者主键列名称的串联。
因此,如果您不想使用一对多创建连接表(映射器),您可能必须指定@joinColumn。
@Entity
public class CompanyImpl {
@OneToMany
@JoinColumn(name=flights_id)
private Set<Flight> flights;
@Entity
public class Flight {
我认为上面给出的答案不够详尽,所以我希望这会有所帮助
原因。为什么 Hibernate 创建一个连接表。
Hibernate 为单向 OneToMany 创建了一个 Join Table,因为通过实现,外键总是保存在多端。因此,在您的示例中,外键将保留在 Flight 表端,从而防止在 Hibernate 选择创建 JoinTable 的多端具有空值。
以你为例,
每个 Flight 都会有一个 CompanyImpl 列,如果没有设置,它必须为 null,因此为了避免在某些 Flight 记录中出现 null,Hibernate 选择有一个 JoinTable 来存储 Flight 和 CompanyImpl 的 Id。