什么是JPA中使用的referencedColumnName?

在JPA中有一个名为referencedColumnName的属性,可以在@JoinColumn, @PrimaryKeyJoinColumn设置,这个设置背后的想法是什么,有人能给出一个很好的例子来说明这个可以使用的地方吗?

在那里指定另一列作为另一个表的默认ID列,例如考虑以下内容

 TableA id int identity tableb_key varchar TableB id int identity key varchar unique // in class for TableA @JoinColumn(column="tableb_key", referencedColumnName="key") 

“referencedColumnName”属性是表格中正在引用您正在指定的列的名称。 或者简短地说:这是目标表中引用的列。 想象一下这样的事情:汽车和人。 一个人可以有很多汽车,但一辆汽车只属于一个人(对不起,我不喜欢其他人驾驶我的汽车)。

表人员
名称char(64)主键
年龄

表车
car_registration char(32)主键
car_brand(char 64)
car_model(char64)
owner_name char(64)外键引用Person(name)

当你实现类,你会有类似的东西

 class Person{ ... } class Car{ ... @ManyToOne @JoinColumn(columnName="owner_name", referencedColumnName="name") private Person owner; } 

希望这可以帮助。

在referencedColumnName上引用API :

此外键列引用的列的名称。

缺省值(仅在使用单个连接列时适用):与被引用表的主键列相同的名称。

Q / A

哪里会被使用?

当引用表中有一个组合PK时 ,则需要指定您引用的列名称。

  • name属性指向包含asociation的列,即外键的列名
  • referencedColumnName属性指向关联/引用实体中的相关列,即主键的列名

如果引用的实体具有单列作为PK,则不需要填写referencedColumnName ,因为毫无疑问,它引用了哪个列(即Address单列ID)。

 @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } 

但是,如果引用的实体具有跨越多列的PK,则指定@JoinColumn注释的顺序具有重要意义。 它可能没有指定referencedColumnName ,但这只是运气。 所以你应该像这样映射它:

 @ManyToOne @JoinColumns({ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") }) public Address getAddress() { return address; } 

或在ManyToMany情况下:

 @ManyToMany @JoinTable( name="CUST_ADDR", joinColumns= @JoinColumn(name="CUST_ID"), inverseJoinColumns={ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") } ) 

真实的例子

由Hibernate生成的两个查询相同的连接表映射,都没有指定引用列。 只有@JoinColumn标注的顺序被改变了。

 /* 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' 
 /* 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' 

我们正在查询一个连接表来获取客户的电子邮件。 {2, 18}是客户端的复合ID。 列名的顺序由@JoinColumn标注的顺序决定。 这两个整数的顺序总是相同的,可能按hibernatesorting,这就是为什么需要正确alignment连接表列,我们不能也不应该依赖映射顺序。

有趣的是,整数的顺序与它们在实体中映射的顺序不匹配 – 在这种情况下,我期望{18, 2} 。 所以看起来Hibernate正在对列名进行sorting,然后在查询中使用它们。 如果这是真的,你会以同样的方式订购你的@JoinColumn你不需要referencedColumnName ,但我只是说这只是为了说明。

正确填充的referencedColumnName属性导致完全相同的查询没有歧义,在我的情况下第二个查询( rev = 2id_client = 18 )。

有关两个表的一般情况的JPA 2.x示例用法,请使用@OneToMany单向连接,请参阅https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_JPA_2.x_unidirectional_OneToMany_relationship_annotations

JPA这篇文章的截图: JPA 2.x单向OneToMany关系数据库的例子