GAE jpa数据库模型示例

时间:2013-04-25 17:06:07

标签: database google-app-engine jpa

我对此非常陌生,如果这是一个愚蠢的问题,我很抱歉。

我正在尝试在JPA中为Google App Engine设计数据库模型,但我无法做到正确。当我发现无法正确获取注释的方式或我收到有关M:N的错误时,Google App Engine不支持。

我需要实体用户拥有多个群组,群组拥有多个用户,并且还有一些用户也是群组管理员。

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

有人能给出一个如何定义关系的简洁例子吗?

2 个答案:

答案 0 :(得分:0)

我对Google App Engine一无所知,但我可以帮助JPA。

这里的问题是“isAdmin”列,它阻止数据模型成为与joiner表的简单@ManyToMany关系。

随着此字段的引入,在数据模型中,您需要使用key = Group和value = isAdmin的User实体上的Map,类似地,您需要在Group实体中使用相应的Map以了解每个User是否为管理员。

使用@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给出了map中“value”元素的名称。

我不确定其中一个实体是否需要insertable = false和updatable = false,可能会因为User和Group之间的循环依赖而避免添加重复的行。

您还需要手动创建集合表,因为至少EclipseLink尝试使用两个“groupId”和“isAdmin”列创建它。如果绝对需要用户和组之间的循环依赖关系,您可以考虑检查设计。

答案 1 :(得分:0)

请试一试。

@Entity
public class User {

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

class 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