سؤال

أواجه مشكلة عند الاستعلام الكيان الذي لديه ثنائي علاقة مع واحد آخر.هذا هو السيناريو:

جداول قاعدة البيانات:

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

بعد دي الاحتجاج ، السبات سجلات يظهر:

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

كما يمكنك أن ترى, الانضمام هو الخاطئ لأنه هو المقارنة بين المستخدمين.البريد الإلكتروني مع الناس.معرف (user1_.البريد الإلكتروني=person2_.معرف) ، لذلك بإرجاع المستخدم دون المقابلة الشخص.

أي أفكار عن كيف يمكنني إصلاح ذلك ؟

شكرا جزيلا !!

هل كانت مفيدة؟

المحلول

أعتقد أن عليك إعادة التفكير عثر.العلاقة بين المستخدم و الشخص يبدو أكثر مثل واحد من الميراث.

المشكلة مع تعيينات لأنها تقف انظر هنا للحصول على مزيد من disussion:

JPA مقدمي الخدمات:لماذا العلاقات/FKs غير PK أعمدة العمل في السبات EclipseLink?

لا 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;

}

في الواقع لم حاولت أن, على الرغم من ذلك التحذير hackor.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top