What is referencedColumnName used for in JPA?
在JPA中,可以在
在那里可以指定另一列作为另一张表的默认ID列,例如考虑以下
1 2 3 4 5 6 7 8 9 10 11 | TableA id int identity tableb_key varchar TableB id int identity key varchar unique // in class for TableA @JoinColumn(name="tableb_key", referencedColumnName="key") |
" referencedColumnName"属性是您要注释的表中正在引用的表中的列的名称。或简而言之:这是目标表中引用的列。想象一下这样的事情:汽车和人。一个人可以拥有多辆汽车,但一辆汽车仅属于一个人(对不起,我不喜欢其他人驾驶我的汽车)。
Table Person
name char(64) primary key
age intTable Car
car_registration char(32) primary key
car_brand (char 64)
car_model (char64)
owner_name char(64) foreign key references Person(name)
当您实现类时,您将获得类似
1 2 3 4 5 6 7 8 9 10 | class Person{ ... } class Car{ ... @ManyToOne @JoinColumn([column]name="owner_name", referencedColumnName="name") private Person owner; } |
编辑:正如@ searchengine27所评论的那样,
在referencedColumnName上引用API:
The name of the column referenced by this foreign key
column.Default (only applies if single join column is being used):
The same name as the primary key column of the referenced table.
问/答
Where this would be used?
当引用表中有复合PK时,则需要指定要引用的列名。
-
name 属性指向包含关联的列,即外键的列名 -
referencedColumnName 属性指向关联/引用实体中的相关列,即主键的列名
如果引用的实体具有作为PK的单列,则不需要填写
1 2 3 | @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } |
但是,如果引用的实体具有跨越多列的PK,则指定
1 2 3 4 5 6 | @ManyToOne @JoinColumns({ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") }) public Address getAddress() { return address; } |
或
1 2 3 4 5 6 7 8 9 10 | @ManyToMany @JoinTable( name="CUST_ADDR", joinColumns= @JoinColumn(name="CUST_ID"), inverseJoinColumns={ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") } ) |
现实生活中的例子
Hibernate生成的两个查询具有相同的联接表映射,均未指定引用列。仅
1 2 3 4 5 6 7 8 9 10 11 12 | /* load collection Client.emails */ select emails0_.id_client as id1_18_1_, emails0_.rev as rev18_1_, emails0_.id_email as id3_1_, email1_.id_email as id1_6_0_ from client_email emails0_ inner join email email1_ on emails0_.id_email=email1_.id_email where emails0_.id_client='2' and emails0_.rev='18' |
1 2 3 4 5 6 7 8 9 10 11 12 | /* load collection Client.emails */ select emails0_.rev as rev18_1_, emails0_.id_client as id2_18_1_, emails0_.id_email as id3_1_, email1_.id_email as id1_6_0_ from client_email emails0_ inner join email email1_ on emails0_.id_email=email1_.id_email where emails0_.rev='2' and emails0_.id_client='18' |
我们正在查询联接表以获取客户的电子邮件。
有趣的是整数的顺序与实体中整数的映射顺序不匹配-在这种情况下,我希望
正确填充的
有关具有
WikiBooks JPA文章的屏幕截图:
JPA 2.x单向OneToMany关系数据库的示例