2013-04-25 60 views
0

我對此很全新,對不起,如果是愚蠢的問題。GAE jpa數據庫模型示例

我試圖設計數據庫模型谷歌應用程序引擎的JPA,但我無法得到它的權利。當我找到我無法正確註釋的方式時,或者我在Google App Engine中不支持M:N時出錯。

我需要實體用戶有多個組,組有多個用戶和有誰也管理員組的用戶。

我的基本模式是User -> usergroup(user; group; (bool)isAdmin) <-Group

有人能給如何定義關係的乾淨和簡單的例子嗎?

回答

0

請試試這個。

@Entity 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Key id; 
    private String name; 
    @ManyToOne(fetch = FetchType.LAZY) 
    private UserGroup usergroup; 
} 

類userGroup表示

@Entity 
public class UserGroup { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Key id; 
    private String name; 
    private boolean admin; 
    @OneToMany(mappedBy = "usergroup", cascade = CascadeType.ALL) 
    private List<User> users = new ArrayList<User>(); 
} 

請注意到GAE對JPA的限制,你可以閱讀更多here

+0

我不明白爲什麼UserGroup應該有多個用戶列表,我怎麼知道誰是管理員。 – johnymachine 2013-04-26 07:26:08

+0

我不知道爲什麼用戶沒有userGroup。但是您可以檢查該用戶是否存在於實體userGroup admin中的用戶列表中。 – 2013-04-26 08:57:55

0

我對Google App Engine一無所知,但我可以幫助JPA。

這裏的問題是「isAdmin」列中,這防止了數據模型以與加入者表的簡單@ManyToMany關係。

隨着此字段的引入,在數據模型中,您需要一個Map實體,其中key = Group和value = isAdmin,類似地,您需要在Group實體中使用相應的Map來知道每個用戶是管理員。

這是通過以下方式與建模@ElementCollection:

@Entity 
@Table(name="User") 
public class User 
{ 
    @Id 
    @GeneratedValue(strategy= GenerationType.TABLE) 
    private int id; 

    private String name; 

    @ElementCollection 
    @CollectionTable(name="Users_Groups", joinColumns={@JoinColumn(name="userId")}) 
    @MapKeyJoinColumn(name="groupId") 
    @Column(name="isAdmin") 
    private Map<Group, Boolean> groups; 
} 

@Entity 
@Table(name="Group") 
public class Group 
{ 
    @Id 
    @GeneratedValue(strategy= GenerationType.TABLE) 
    private int id; 

    private String name; 

    @ElementCollection 
    @CollectionTable(name="Users_Groups", joinColumns={@JoinColumn(name="groupId")}) 
    @MapKeyJoinColumn(name="userId", insertable=false, updatable=false) 
    @Column(name="isAdmin", insertable=false, updatable=false) 
    private Map<User, Boolean> users; 
} 

的重要註解是@ElementCollection,其他的註解是僅舉集合表的特定列,並確保他們從兩個匹配實體:@CollectionTable給出表的名稱和表示當前實體中的id的列的名稱。 @MapKeyJoinColumn給出表示Map中「key」元素的id的列的名稱,@Column給出地圖中「value」元素的名稱。

我不知道,如果插入=虛假和可更新=假都需要在實體之一,可能會避免增加重複的行由於用戶和組之間的循環依賴。

你也需要手動創建採集表,因爲至少EclipseLink的嘗試與兩個「的groupId」和「isAdmin」欄目創建它。您可能會考慮檢查設計是否絕對需要用戶和組之間的循環依賴關係。

+0

謝謝你的答案,但我試圖多對多模型,並得到了不支持的例外。 – johnymachine 2013-04-26 07:24:42

+0

我無法想象如何在ManyToMany關係中使用「isAdmin」列。如果你忘記了表和關係模型,只關心你需要的對象模型,那麼java類看起來如何呢? – German 2013-04-26 14:03:47