当我查询与另一个有oneoone关系的实体时,我遇到了问题。这是场景:

数据库表:

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

create table users (
    email varchar(512) NOT NULL
);
.

测试数据:

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');
.

实体:

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

调用:

...
User user = entityManager.find(User.class, "jhon@domain.com");
...
.

de调用后,hibernate的日志显示:

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=?
.

正如您所看到的,加入是错误的,因为正在与人们比较用户.ID( user1_.email= person2_id ),因此它返回一个用户没有相应的

关于如何修复它的任何想法?

非常感谢!!

有帮助吗?

解决方案

我认为你应该重新考虑你的DataModel。用户和人与人之间的关系看起来更像是继承之一。

在您的映射时,他们认为在这里看到一些进一步的混乱:

jpa提供者:为什么在Hibernate和Eclipselink中为非PK列工作的关系/ FKS?

JPA规范允许参考非主键列?

其他提示

严格来说, JPA规范不允许对非主键列的引用。它可能在一些JPA实现中工作,但它不合适。

但是,我认为您可以通过使关系双向的关系,并由非主键拥有:

@Entity
public class Person {

    @Id
    private long id;

    @OneToOne
    @JoinColumn(name = "email")
    private User user;

    public String getEmail() {
        return user.getEmail();
    }

    public void setEmail(String email) {
        // left as an exercise for the reader
    }

}

@Entity
public class User {

    @Id
    private String email;

    @OneToOne(mappedBy = "user")
    private Person person;

}
.

我没有实际尝试过,所以警告黑客

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top