jpa hibernate @OneToOne @JoinColumn referencedColumnName被忽略 [英] jpa hibernate @OneToOne @JoinColumn referencedColumnName ignored
问题描述
在对与另一个实体具有一对一关系的实体执行jpql查询时,遇到意外行为。关键是,关系是从根实体的主键到目标实体的非ID的字段。
以下是示例:
//根实体
@实体
@Table(name =PERSON)
public class Person {
@Id
@Column(name =PERSON_ID)
私人长ID;
私人字符串名称;
@OneToOne(可选= false)
@JoinColumn(name =PERSON_ID,referencedColumnName =PERSON_ID,insertable = false,updatable = false,unique = true)
私人地址mainAddress;
...
//引用实体
实体
表(名称=ADDRESS)
公共类地址{
@Id
@Column(name =ADDRESS_ID)
私人长ID;
@Column(name =PERSON_ID)
private long personId;
...
}
以下jpql查询:
从Person p中选择p left join fetch p.mainAddress
生成以下ORACLE SQL查询:
SELECT ... FROM PERSON p LEFT OUTER加入地址a p.PERSON_ID = a.ADDRESS_ID
虽然我期望:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.PERSON_ID
基本上, referencedColumnName =PERSON_ID属性的属性将被忽略,并且会在主键上执行连接。
有人可以请我解释一下为什么?
c> @OneToOne 按原样映射,外键将出现在Person表中,即。 Person表(如果你没有在@JoinColumn注解中指定person_id)应该有一个FK列'address_id'。
形成你期望生成的SQL的外观像,它会出现你想FK在地址表中,即地址有一个FK列person_id。你可以这样做:
@Entity
@Table(name =PERSON)
public class Person {
@Id
@Column(name =PERSON_ID)
私人长ID;
私人字符串名称;
@OneToOne(mappedBy =person)
private地址mainAddress;
$ b @Entity
@Table(name =ADDRESS)
公共类地址{
@Id
@Column(name =ADDRESS_ID)
私人长ID;
@OneToOne(可选= false)
@JoinColumn(name =PERSON_ID,可插入= false,可更新= false,唯一= true)
私人person person;
}
I am experiencing an unexpected behavior while performing a jpql query on an entity having a one-to-one relationship with another. The key point is that the relationship is from the primary key of the root entity to a field of the destination entity which is not the ID.
Here is the example:
// root entity
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "PERSON_ID")
private long id;
private String name;
@OneToOne(optional = false)
@JoinColumn(name = "PERSON_ID", referencedColumnName = "PERSON_ID", insertable = false, updatable = false, unique = true)
private Address mainAddress;
...
}
// referenced entity
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name = "ADDRESS_ID")
private long id;
@Column(name = "PERSON_ID")
private long personId;
...
}
The following jpql query:
select p from Person p left join fetch p.mainAddress
Produces the following ORACLE SQL query:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.ADDRESS_ID
While I expected :
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.PERSON_ID
Basically the attribute of the referencedColumnName = "PERSON_ID" attribute is ignored and the join is performed on the primary key.
Somebody can please explain me why?
With the @OneToOne
mapped as it is, the foreign key is going to be in the Person table, viz. the Person table (if you hadn't specified person_id in the @JoinColumn annotation) should have a FK column 'address_id'.
Form what you expect the generated SQL to look like, it would appear that you want the FK to be in the address table i.e. address has a FK column person_id. You can do this by as follows:
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "PERSON_ID")
private long id;
private String name;
@OneToOne(mappedBy = "person")
private Address mainAddress;
}
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name = "ADDRESS_ID")
private long id;
@OneToOne(optional = false)
@JoinColumn(name = "PERSON_ID", insertable = false, updatable = false, unique = true)
private Person person;
}
这篇关于jpa hibernate @OneToOne @JoinColumn referencedColumnName被忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!