2010-12-28 7 views
0

Eine Profiltabelle hat eine Zuordnung von eins zu viele mit einer Privilege-Tabelle. Die Berechtigungstabelle hat einen mehrteiligen Schlüssel, eine profile_id und eine privileg_id. Ich möchte von der Profiltabelle nur zur Profilid in die Privilege-Tabelle wechseln und eine Sammlung von Berechtigungen zurückerhalten.JPA @OneToMany Join auf Teil eines mehrteiligen Schlüssels

In meinem Profil Klasse Ich habe

@OneToMany(fetch = FetchType.LAZY) 
@JoinColumn(name = "PROF_ID") 
public List<ProfilePrivilegeEO> getProfilePrivileges() 
{ 
    return m_profilePrivileges; 
} 

Meine Berechtigungsklasse

private ProfilePrivilegeId m_profileId; 

@EmbeddedId 
public ProfilePrivilegeId getProfileId() 
{ 
    return m_profileId; 
} 

Wo ProfilePrivilegeId ist

@Embeddable 
public class ProfilePrivilegeId 
    implements Serializable 
{ 
    private Integer m_profileId; 
    private Integer m_privNumber; 

    @Column(name = "PROF_ID") 
    public Integer getProfileId() 
    { 
     return m_profileId; 
    } 

    @Column(name = "PRIV_NUM") 
    public Integer getPrivNumber() 
    { 
     return m_privNumber; 
    } 

    ..... 
} 

Allerdings, wenn ich tun, dass der statische Weber sagt:

The @JoinColumns on the annotated element [method getProfilePrivileges] from the entity  
class [class com.acme.ProfileEO] is incomplete. When the source entity class uses a 
composite primary key, a @JoinColumn must be specified for each join column using the 
@JoinColumns. Both the name and the referencedColumnName elements must be specified in 
each such @JoinColumn. 

Allerdings hat die Profiltabelle keine Kenntnis von privilege_ids ... Ich sehe nicht, warum JPA verlangen sollte, dass ich beide Schlüssel der Berechtigungstabelle angabe, das ist nur eine willkürliche Entscheidung von jpa ohne gültigen Grund. .. Was muss ich tun, damit das funktioniert? (Ich verwende EclipseLInk.)

Antwort

0

Erstellen Sie eine PrivilegeId-Klasse, die die IDs einkapselt. Mache diese Klasse @Embedded und lege sie mit @EmbeddedId in das Privileg.

Fügen Sie in der PrivilegeId-Klasse eine @OneToMany-Eigenschaft dem Profil und der Berechtigungs-ID hinzu.

+0

Der erste Teil ist was ich getan habe. Das Profil ist OneToMany zum Privileg. nicht andersrum. Der Join ist nur auf der Profil-ID. – MeBigFatGuy

+0

Was ist ProfilePrivilegeEO? Fügen Sie die Annotation @JoinColumns ein und verwenden Sie die beiden @JoinColumn dort. Dies wirkt sich nicht negativ auf das generierte Schema aus, da in der @OneToMany der Schlüssel in der fremden Klasse liegt, der Berechtigung (genau dort, wo sie eigentlich ist und sein sollte). –

+0

ProfilePrivilegeEO ist die Entität für die Berechtigungstabelle. Ich habe nicht zwei @ JoinColumns zur Angabe von der Profilklasse, da sie nicht über Berechtigungen verfügt. Das ist das Problem. – MeBigFatGuy

Verwandte Themen