Database GAE jpa数据库模型示例

Database GAE jpa数据库模型示例,database,google-app-engine,jpa,Database,Google App Engine,Jpa,我对这个完全陌生,如果这是一个愚蠢的问题,我很抱歉 我试图在JPA中为谷歌应用程序引擎设计数据库模型,但我无法正确实现。当我发现我无法正确获取注释,或者我得到了关于Google App Engine不支持的M:N的错误信息时 我需要实体用户有多个组,组有多个用户,还有一些用户也是组管理员 我的基本模式是User->usergroup(User;group;(bool)isAdmin)我对谷歌appengine一无所知,但我可以帮助JPA 这里的问题是“isAdmin”列,它阻止数据模型成为一个简

我对这个完全陌生,如果这是一个愚蠢的问题,我很抱歉

我试图在JPA中为谷歌应用程序引擎设计数据库模型,但我无法正确实现。当我发现我无法正确获取注释,或者我得到了关于Google App Engine不支持的M:N的错误信息时

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


我的基本模式是
User->usergroup(User;group;(bool)isAdmin)我对谷歌appengine一无所知,但我可以帮助JPA

这里的问题是“isAdmin”列,它阻止数据模型成为一个简单的@manytomy关系和一个joiner表

引入此字段后,在数据模型中,您需要key=Group和value=isAdmin的用户实体上的映射,同样,您需要Group实体中的对应映射,以了解每个用户是否为管理员

这是通过@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;
}
@实体
@表(name=“User”)
公共类用户
{
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
私有int-id;
私有字符串名称;
@元素集合
@CollectionTable(name=“Users\u Groups”,joinColumns={@JoinColumn(name=“userId”)})
@MapKeyJoinColumn(name=“groupId”)
@列(name=“isAdmin”)
私有地图组;
}
@实体
@表(name=“Group”)
公共课组
{
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
私有int-id;
私有字符串名称;
@元素集合
@CollectionTable(name=“Users\u Groups”,joinColumns={@JoinColumn(name=“groupId”)})
@MapKeyJoinColumn(name=“userId”,insertable=false,updateable=false)
@列(name=“isAdmin”,insertable=false,updateable=false)
私人地图用户;
}
重要的注释是@ElementCollection,其他注释只是命名集合表的特定列,并确保它们与两个实体匹配:@CollectionTable提供表的名称和表示当前实体中id的列的名称@MapKeyJoinColumn给出表示映射中“key”元素id的列的名称,@column给出映射中“value”元素的名称

我不确定其中一个实体中是否需要insertable=false和updateable=false,因为用户和组之间存在循环依赖关系,所以可能会避免添加重复行

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

< P>请试试这个。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
    private String name;
    @ManyToOne(fetch = FetchType.LAZY)
    private 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>();
}
@实体
公共类用户组{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私钥id;
私有字符串名称;
私有布尔管理;
@OneToMany(mappedBy=“usergroup”,cascade=CascadeType.ALL)
private List users=new ArrayList();
}

请注意,GAE对JPA有限制,您可以阅读更多内容

谢谢您的回答,但我尝试对多个进行建模,但得到了不受支持的异常。我无法想象如何在多个关系中设置“isAdmin”列。如果您忘记了表和关系模型,而只关心您需要的对象模型,那么java类是什么样子的?我不明白为什么用户组应该有多个用户列表,我如何判断谁是管理员。我不确定用户为什么没有用户组。但您可以检查用户是否存在于entity userGroup admin的用户列表中。