我不同意Óscar López这里接受的答案。这个答案是不准确的!
它不是@JoinColumn,这表明该实体是关系的所有者。取而代之的是@ManyToOne注释(在他的例子中)。
关系注释如@ManyToOne, @OneToMany和@ManyToMany告诉JPA/Hibernate创建映射。默认情况下,这是通过一个单独的连接表来完成的。
@JoinColumn
@JoinColumn的目的是创建一个连接列(如果有的话)
不存在。如果是,则可以使用此注释
命名连接列。
的MappedBy
MappedBy参数的目的是指示JPA: Do NOT
创建另一个连接表,因为已经映射了关系
通过这种关系的相反实体。
请记住:MappedBy是关系注释的一个属性,其目的是生成一种机制来关联两个实体,默认情况下,它们通过创建一个连接表来实现。MappedBy在一个方向上停止这个过程。
The entity not using MappedBy is said to be the owner of the relationship because the mechanics of the mapping are dictated within its class through the use of one of the three mapping annotations against the foreign key field. This not only specifies the nature of the mapping but also instructs the creation of a join table. Furthermore, the option to suppress the join table also exists by applying @JoinColumn annotation over the foreign key which keeps it inside the table of the owner entity instead.
总的来说:@JoinColumn要么创建一个新的连接列,要么重命名一个现有的连接列;而MappedBy参数与其他(子)类的关系注释协同工作,以便通过连接表或在所有者实体的关联表中创建外键列来创建映射。
为了说明MapppedBy是如何工作的,考虑下面的代码。如果MappedBy参数被删除,那么Hibernate实际上会创建两个连接表!为什么?因为在多对多关系中存在对称性,Hibernate没有理由选择一个方向而不是另一个方向。
因此,我们使用MappedBy告诉Hibernate,我们已经选择了另一个实体来指示两个实体之间关系的映射。
@Entity
public class Driver {
@ManyToMany(mappedBy = "drivers")
private List<Cars> cars;
}
@Entity
public class Cars {
@ManyToMany
private List<Drivers> drivers;
}
在owner类中添加@JoinColumn(name = "driverID")(见下文),将防止创建连接表,相反,在Cars表中创建一个driverID外键列来构建映射:
@Entity
public class Driver {
@ManyToMany(mappedBy = "drivers")
private List<Cars> cars;
}
@Entity
public class Cars {
@ManyToMany
@JoinColumn(name = "driverID")
private List<Drivers> drivers;
}