非主键列的一对一关系

RDV*_*RDV 5 java jpa one-to-one java-ee joincolumn

查询一个与另一个对象具有OneToOne关系的实体时遇到问题。这是方案:

数据库表:

create table people (
    id decimal(10,0) NOT NULL,
    email varchar(512) NOT NULL
);

create table users (
    email varchar(512) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

测试数据:

insert into users (email) values ('jhon@domain.com');
insert into users (email) values ('mary@domain.com');

insert into people (id, email) values (1, 'jhon@domain.com');
insert into people (id, email) values (2, 'mary@domain.com');
Run Code Online (Sandbox Code Playgroud)

实体:

@Entity(name = "people")
public class Person implements Serializable {

    @Column
    @Id
    private long id;

    @Column
    private String email;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

@Entity(name = "tbl_users")
public class User implements Serializable {

    @Id
    private String email;

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name = "email", referencedColumnName = "email")
    private Person person;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
Run Code Online (Sandbox Code Playgroud)

调用:

...
User user = entityManager.find(User.class, "jhon@domain.com");
...
Run Code Online (Sandbox Code Playgroud)

取消调用后,休眠的日志显示:

select user1_.email as email2_0_, person2_.id as id1_1_, person2_.email as email1_1_
from users user1_ left outer join people person2_ on user1_.email=person2_.id
where user1_.email=?
Run Code Online (Sandbox Code Playgroud)

如您所见,该连接是错误的,因为正在将users.email与people.id(user1_.email = person2_.id)进行比较,因此它返回一个不带相应PersonUser

关于如何解决的任何想法?

非常感谢 !!

Ala*_*Hay 0

我认为你应该重新考虑你的数据模型。User 和 Person 之间的关系看起来更像是一种继承关系。

对于您的映射问题,请参阅此处进行进一步讨论:

JPA 提供者:为什么与非 PK 列的关系/FK 在 Hibernate 和 EclipseLink 中有效?

JPA 规范是否允许引用非主键列?