San*_*eep 0 java persistence hibernate jpa associations
我试图理解 javax.persistence 注释@OneToOne、@ManyToOne和@ManyToMany。这些注释的描述提到了non-owning side. 具体来说:
[@OneToOne]: 如果关系是双向的,非拥有方必须使用 OneToOne 注解的mappedBy元素来指定拥有方的关系字段或属性。
[@ManyToOne]: 如果关系是双向的,则非拥有OneToMany 实体方必须使用mappedBy 元素来指定作为关系所有者的实体的关系字段或属性。
[@ManyToMany]: 如果关系是双向的,非拥有方必须使用ManyToMany注解的mappedBy元素来指定拥有方的关系字段或属性。
我无法理解这个所有权方面。例如,我有以下关联:
注:图片取自此处。
那么这些协会的非控股主体有哪些呢?
在两个对象之间的双向关系中,您必须选择哪一方来管理关系。从数据库的角度来看,管理关系意味着管理两个表之间链接的某些 FK 列的值。管理它的一方称为拥有方。否则,称为非拥有方。
回到你关于ProjectManager和 的例子Project。哪个对象是拥有方取决于您选择哪个对象来管理它们的关系。
如果您选择ProjectManager成为拥有方(因此Project是非拥有方),则仅ProjectManager#getProjects()使用 的值来确定此类 FK 列的值。(即本例中的projecttable 的project_manager_id列) 的值Project#getProjectManager()将被忽略,并且不会影响此 FK 列的值。
就 JPA 映射而言,它是:
@Entity
@Table(name="project_manager")
public class ProjectManager{
@OneToMany
private List<Project> projects = new ArrayList<>();
}
@Entity
@Table(name="project")
public class Project {
@ManyToOne
@JoinColumn(name = "project_manager_id")
private ProjectManager projectManager;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您选择Project拥有方(因此ProjectManager是非拥有方),则仅Project#getProjectManager()使用 的值来确定该 FK 列的值,而 的值ProjectManager#getProjects()将被忽略。本例中的 JPA 映射将是:
@Entity
@Table(name="project_manager")
public class ProjectManager{
@OneToMany(mappedBy="projectManager")
private List<Project> projects = new ArrayList<>();
}
@Entity
@Table(name="project")
public class Project {
@ManyToOne
@JoinColumn(name = "project_manager_id")
private ProjectManager projectManager;
}
Run Code Online (Sandbox Code Playgroud)
PS:我用属性访问来解释它,希望你能明白。
| 归档时间: |
|
| 查看次数: |
1789 次 |
| 最近记录: |