JPA - 非主键字段上的@OneToOne关系不起作用

时间:2015-04-16 09:06:43

标签: java hibernate jpa spring-data-jpa one-to-one

我使用Hibernate作为ORM实现的Spring Data JPA后端。

这是模型:

 __________     _________________________
 |Person  |     |MailConfig             |
 |________|     |_______________________|
 | id PK  |     | uid PK-FK(Person.uid) |
 | uid    |     | ...                   |
 | ...    |     |                       | 
 |________|     |_______________________|

@Entity
@Table(name="Person")
public class PersonEntity{

    @Id
    private String id;

    private String uid;

    @OneToOne(mappedBy="id", fetch=FetchType.EAGER)
    private MailConfigEntity mailConfigNotes;

    ...
}

@Entity
@Table(name="MailConfig")
public class MailConfigEntity implements Serializable{

    @Id
    @OneToOne
    @JoinColumn(name="uid", table="Person", referencedColumnName="uid", insertable = false, updatable = false)
    private PersonEntity id;

    ...
}

Person表通过不是Person的主键的字段与MailConfig表连接。当我使用personDAO.findOne(id)加载实体时,我可以看到查询中的连接是针对person.id而不是person.uid(on personent0_.id=mailconfig2_.uid)执行的。知道为什么这不起作用吗?

查询日志:

    select
        personent0_.id as id8_2_,
        personent0_.uid as uid8_2_,
        mailconfig2_.uid as uid5_1_
    from
        Person personent0_ 
    left outer join
        mailconfig mailconfig2_ 
            on personent0_.id=mailconfig2_.uid 
    where
        personent0_.id=?

1 个答案:

答案 0 :(得分:0)

根据文档,检查这是否是外键

  

一对一协会有三种情况:要么是   关联实体共享相同的主键值,即外键   由其中一个实体持有(注意这个FK列中的   数据库应该被约束为模拟一对一的唯一   multiplicity),或关联表用于存储链接   在两个实体之间(必须在每个实体上定义唯一约束)   fk确保一对一的多重性。)

此外,JoinColumn应位于关系的所有者一侧