Question

Je pose un problème lorsque je demande une entité qui a une relation oneoone avec une autre.C'est le scénario:

Tables de base de données:

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

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

Données de test:

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

entités:

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

Invocation:

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

Après l'invocation, les journaux de Hibernate indiquent:

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

Comme vous pouvez le constater, la jointure est fausse car est la comparaison des utilisateurs.Email avec des gens.Id ( user1_.email= personne2_.id ), il renvoie donc un utilisateur > Sans sa personne correspondante .

Des idées sur comment puis-je le réparer?

merci beaucoup !!

Était-ce utile?

La solution

Je pense que vous devriez repenser votre Datamodel.La relation entre l'utilisateur et la personne ressemble davantage à une héritage.

Pour le problème avec vos mappages car ils se trouvent voir ici pour une nouvelle disussion:

JPAFournisseurs: pourquoi les relations / fks to non-PK fonctionnent-elles dans Hibernate et Eclipselink?

La spécification JPA autorise-elle les références àcolonnes clés non primaires?

Autres conseils

Strictement parler, La spécification JPA faitNe pas autoriser les références à des colonnes clés non primaires .Cela peut fonctionner dans certaines implémentations de la JPA, mais ce n'est pas approprié.

Cependant, je pense que vous pouvez le faire en faisant la relation bidirectionnelle et possédée du côté avec la clé non primaire:

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

}

Je n'ai pas vraiment essayé cela, cependant, alors Cavaat Hackor .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top