2011-06-28 10 views
1

我想做一個使用JPA的Jaas登錄模塊來存儲我的AuthUserAuthUserRole。我將在這個問題上關注JPA方面。EclipseLink:是否可以將作爲外鍵的@EmbeddedId屬性的@OneToMany關係添加到類上?

以下是我將在數據庫(不是所有合法的SQL代碼,但希望全面)做:

TABLE AuthUser(INT uid, VARCHAR password) 
PRIMARY KEY (uid) 

TABLE AuthUserRole(INT uid, INT role) 
PRIMARY KEY (uid , role) 
FOREIGN KEY (uid) REFERENCE AuthUser.uid 

這對我來說很有意義,一個角色只能使用一次,分配給用戶。

這是我試圖用Java做的,而不是顯示爲AuthUser用戶名和電子郵件:

@Entity 
public class AuthUser { 
    @Id 
    private int uid; 

    private String password; 

    @OneToMany 
    private Set<AuthUserRole> roles; 
} 

@Entity 
public class AuthUserRole { 

    @Embeddedid 
    private AuthUserRolePK authUserRolePK; 
} 

@Embeddable 
public class AuthUserRolePK { 
    public int uid; 
    public int role; 
} 

的EclipseLink不映射就好了,這意味着它的工作原理,但不是我想要的方式。它創建了第三個名爲* authuser_authuserrole *的表,其中包含(AuthUser_uid,uid,role)列。無需提及AuthUser_uid和uid是相同的。

瑣碎的答案是:

@Entity 
public class AuthUser { 
    @Id 
    private int uid; 

    private String password; 

    @OneToMany 
    @JoinColumn(name="authUserRolePK.uid", referencedColumnName="uid") 
    private Set<AuthUserRole> roles; 
} 

但EclipseLink的cryes,當使用@EmbeddedId,所有主鍵列必須被提及。

問:我該如何讓Eclipselink映射我的實體,比如我提到的數據庫模式?我應該使用@IdClass嗎?我可以看到數據庫的結果 - >實體映射,但這太容易了:)

謝謝你的回答!

+0

這不是關於嵌入式編程。 stackoverflow.com/tags/embedded/info。 Retagged –

回答

0

三張表是實際執行此操作的典型方式,您的方法完全缺乏一點JPA技巧。

通常你有關聯的三個表如下:

AuthUser  AuthUser_Role (association)  Role 
frank  ----   frank,admin  ----- admin

這實際上是什麼樣的EclipseLink試圖地圖給你,但在一般情況下,你沒有創建AuthUser_Role映射自己。

@ManyToMany 
Set<Roles> userRoles 

和(可選)的角色,如::相反,你在爲AuthUser像創建一個字段

@ManyToMany(mappedBy="userRoles") 
Set<AuthUser> usersWithRole; 

隨後的EclipseLink需要照顧的連接表的你,和所有你需要擔心是userRoles字段,它將更新連接。

您可以擴展它以手動創建加入,以便在設置日期等開始和結束的角色創建聯接,但除了最複雜的項目之外的所有項目(通常不是必需的),並且通常可以以不同的方式完成。出於合規性考慮,使用ELUG擴展之一來保存和訪問更改歷史記錄比較容易,這是我見過的將額外元數據添加到聯接信息的最常見原因。


或者,如果你真的想只用兩個表來做到這一點,使AuthUserRole初級側,和爲AuthUser被動方。

@Entity 
public class AuthUser { 
    @Id 
    private int uid; 

    private String password; 

    @OneToMany(mappedBy="user") 
    private Set<AuthUserRole> roles; 
} 

@Entity 
public class AuthUserRole { 

    @Embeddedid 
    private AuthUserRolePK authUserRolePK; 
} 

@Embeddable 
public class AuthUserRolePK { 
    public AuthUser user; 
    public int role; 
} 

在這種結構中,你將最終只有兩個表,而「用戶」字段中確實將等於爲AuthUser的在數據庫中的UID,它只是顯示爲在Java端對象。

+0

@ManyToMany Set userRoles,這讓我相信這是一個更好的方法。我認爲在試圖在@entities中創建模型時,不要考慮關係模型。我會用這種方法。 – illEatYourPuppies

相關問題