java - jpa hibernate @OneToOne @JoinColumn referencedColumnName 忽略

标签 java hibernate jpa entity

我在对与另一个实体具有一对一关系的实体执行 jpql 查询时遇到意外行为。关键点是关系是从根实体的主键到目的实体的一个字段,不是ID。

例子如下:

// 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;
    ...
}

以下 jpql 查询:

select p from Person p left join fetch p.mainAddress

生成以下 ORACLE SQL 查询:

SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON 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" 属性的属性被忽略,并且在主键上执行连接。

有人可以解释一下为什么吗?

最佳答案

随着 @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")
    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;

}

关于java - jpa hibernate @OneToOne @JoinColumn referencedColumnName 忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37047938/

相关文章:

java - 使用 javac 无法找到输出 .class 文件?

java - 调用 super() 构造函数是否应该在构造函数的第一行?

spring - 如何在独立应用程序(jar)中使用 spring 将外部文件的属性包含到 hibernate.cfg.xml

java - 映射到子表两次 - @OneToMany & @ManyToOne

java - 自动生成的 id 未级联在 Hibernate 子实体中的 EmbeddedId 上

java - 用Java获取MSG Outlook文件的原始内容(字符串格式)

java - 从 PHP 中运行 Java 程序时出现问题

java - 基于几乎所有列进行查询时如何最有效地访问表?

java - Hibernate 在事务插入后检索旧数据

java - 使用 Mockito 模拟 JPA CriteriaBuilder