【发布时间】:2018-11-13 18:45:58
【问题描述】:
@ManyToOne
@JoinColumn(name = "someValue" , referencedColumnName = "someOtherValue" )
如果两个表通过ManyToOne 关联链接,那么name 和referencedColumnName 列中应放置哪些值?
【问题讨论】:
@ManyToOne
@JoinColumn(name = "someValue" , referencedColumnName = "someOtherValue" )
如果两个表通过ManyToOne 关联链接,那么name 和referencedColumnName 列中应放置哪些值?
【问题讨论】:
假设你有两个表:
1. Department table with columns:
a. Dept_ID (primary key)
b. Dept_Name
2. Employee Table with following column:
a. Emp_Id (primary key)
b. Dept_Id_fk (foreign key)
c. Salary
现在您的员工实体类的联接列将是
@ManyToOne
@JoinColumn(name = "Dept_Id_fk", referencedColumnName = "Dept_ID")
Department department;
因此,referencedColumnName 表示您从外键列中引用的列。
【讨论】:
oneToMany 关联的联接列是什么样的?这是一个例子:
人员表:
person_id (pk),person_name
person_reltn 表:
person_reltn_id (pk), child_person_id (fk), parent_person_id (fk)
对于上述表格,如果我要创建 Person 实体:
class Person(){
@Id
@Column(name = "PERSON_ID")
private long personId;
@NotFound(action = NotFoundAction.IGNORE)
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(
name = "CHILD_PERSON_ID",
referencedColumnName = "PERSON_ID",
updatable = false,
insertable = false)
@Where(clause = "ACTIVE_IND = 1")
@Filter(
name = FilterConstants.END_EFFECTIVE_DATE_TIME_FILTER,
condition = FilterConstants.END_EFFECTIVE_DATE_TIME_CONDITION)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
private final List<PersonRelation> personRelations = new ArrayList<>();
}
在 joinColumn 中,名称是否应始终具有外键(这意味着您要加入的实体的值),而 referenceColumnName 应始终具有实体上的主键?如果是,这将与上述 Sayantan 的回答相反。如果我误解了这个概念,请告诉我。
2021 年 3 月 4 日更新
经过更多研究,我找到了有关如何根据实体映射设置 referenceColumnName 的文档[1]。看起来,对于单向 OneToMany 映射,引用的列在源实体的表中。
1.https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html
【讨论】: