jpa hibernate @OneToOne @JoinColumn referencedColumnName被忽略 [英] jpa hibernate @OneToOne @JoinColumn referencedColumnName ignored

查看:1281
本文介绍了jpa hibernate @OneToOne @JoinColumn referencedColumnName被忽略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在对与另一个实体具有一对一关系的实体执行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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆