2016-06-23 3 views
0

Ich habe 2 Einheiten Benutzer und Profil wo ein Benutzer ein Profil hat.Erhalten bestimmter Wert von der ausländischen Einheit mit JPA

Die User Entitätszuordnung ist ziemlich klar und sieht wie folgt aus:

@Entity 
public class User { 

    @Id 
    private String id; 

    @Column(unique = true, nullable = false) 
    private String email; 

    @Column(unique = true, nullable = false) 
    private String name; 
} 

So ist die Frage nach Profil Entitätszuordnung ist, die heikele Sache hier ist, dass Profil des Benutzers E-Mail enthält (nicht gesamtes Benutzer-Entität), aber es sollte nicht entweder aktualisiert werden oder von Profil gespeichert werden, so dass die E-Mail-Attribut nur gelesen von der fremden Benutzereinheit ist.

verwendete ich die Entitätszuordnung der folgenden Profile für Benutzer-E-Mail erhalten:

@Entity 
public class Profile { 

    @Id 
    private String userId; 

    @PrimaryKeyJoinColumn 
    private User user; 

    @Basic 
    private String firstName; 

    @Basic 
    private String lastName; 

    // ... 

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

Also habe ich beschlossen, die gesamte Einheit zu verbinden und um die Arbeit zu delegieren. Soweit ich verstehe, ist es unmöglich, mit @Column wie diesem @JoinColumn in Paar zu verwenden:

@OneToOne 
@JoinColumn(name = "userId", insertable = false, updatable = false) 
@Column(name = "email") 
private String email; 

Ich bin auch über die Verwendung von @SecondaryTable nicht sicher, wie es scheint, dass es für einen anderen Zweck ausgelegt ist.

Gibt es einen besseren Ansatz für fremde Entität Feld mit JPA-Mappings?

  • JPA Backend: Eclipse 2.6.2

Antwort

1

Das ist nicht wirklich das, was JPA zu tun wurde entwickelt, um. Das Erhalten der E-Mail, indem Sie einfach user.getEmail() anrufen, ist die sauberste Option, die Sie haben.

Sie sollten sich nicht zu viele Gedanken über das Laden des gesamten Benutzers machen; So wie ich es sehe, ist es ein einziger Beitritt, und JPA sollte es für dich tun. Die Auswirkungen auf die Leistung sollten minimal sein. (Sie können das interne Benutzerobjekt einfach nicht belichten, um das Objektdesign nicht zu sehr zu beeinträchtigen. Wenn Sie JPA verwenden, beschränken Sie jedoch immer Ihre OO-Designoptionen).

Wenn Sie Hibernate verwenden, würde die Geschichte anders sein. Dann könnten Sie die @Formula Annotation verwenden. Es wäre jedoch nicht performanter. Eclipselink hat nichts dergleichen.

Verwandte Themen