我對此很全新,對不起,如果是愚蠢的問題。GAE jpa數據庫模型示例
我試圖設計數據庫模型谷歌應用程序引擎的JPA,但我無法得到它的權利。當我找到我無法正確註釋的方式時,或者我在Google App Engine中不支持M:N時出錯。
我需要實體用戶有多個組,組有多個用戶和有誰也管理員組的用戶。
我的基本模式是User -> usergroup(user; group; (bool)isAdmin) <-Group
有人能給如何定義關係的乾淨和簡單的例子嗎?
我對此很全新,對不起,如果是愚蠢的問題。GAE jpa數據庫模型示例
我試圖設計數據庫模型谷歌應用程序引擎的JPA,但我無法得到它的權利。當我找到我無法正確註釋的方式時,或者我在Google App Engine中不支持M:N時出錯。
我需要實體用戶有多個組,組有多個用戶和有誰也管理員組的用戶。
我的基本模式是User -> usergroup(user; group; (bool)isAdmin) <-Group
有人能給如何定義關係的乾淨和簡單的例子嗎?
請試試這個。
@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
我對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」欄目創建它。您可能會考慮檢查設計是否絕對需要用戶和組之間的循環依賴關係。
謝謝你的答案,但我試圖多對多模型,並得到了不支持的例外。 – johnymachine 2013-04-26 07:24:42
我無法想象如何在ManyToMany關係中使用「isAdmin」列。如果你忘記了表和關係模型,只關心你需要的對象模型,那麼java類看起來如何呢? – German 2013-04-26 14:03:47
我不明白爲什麼UserGroup應該有多個用戶列表,我怎麼知道誰是管理員。 – johnymachine 2013-04-26 07:26:08
我不知道爲什麼用戶沒有userGroup。但是您可以檢查該用戶是否存在於實體userGroup admin中的用戶列表中。 – 2013-04-26 08:57:55