Domanda

Sto avendo un problema quando interrogo un'entità che ha una relazione OneToone con un'altra.Questo è lo scenario:

Database Tabelle:

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

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

Dati di 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à:

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

Invocazione:

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

After de Invocation, i registri di Ibernazione mostrano:

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

Come puoi vedere, il join è sbagliato perché confronta gli utenti.mail con persone.ID ( user1_.email= persona2_.id ), quindi restituisce un utente Senza la sua corrispondente Persona .

Qualche idea su come posso aggiustarla?

Grazie mille !!

È stato utile?

Soluzione

Penso che dovresti ripensare al tuo DataModel.La relazione tra l'utente e la persona sembra più una delle ereditarietà.

Per il problema con i tuoi mapping man mano che si rendono qui per alcune ulteriori distorsione:

JPAFornitori: Perché le relazioni / FKS alle colonne non PK funzionano in Hibernate ed Eclipselink?

La specifica JPA consente ai riferimenti aColonne chiave non primarie?

Altri suggerimenti

rigorosamente parlando, La specifica JPA fanon consentire riferimenti a colonne chiave non primarie .Può funzionare in alcune implementazioni JPA, ma non è corretta.

Tuttavia, penso che tu possa farlo rendendo la relazione bidirezionale e di proprietà di lato con la chiave non primaria:

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

}
.

Non l'ho effettivamente provato, però, quindi Hackor HACKOR .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top