我对此非常陌生,如果这是一个愚蠢的问题,我很抱歉。
我正在尝试在JPA中为Google App Engine设计数据库模型,但我无法做到正确。当我发现无法正确获取注释的方式或我收到有关M:N的错误时,Google App Engine不支持。
我需要实体用户拥有多个群组,群组拥有多个用户,并且还有一些用户也是群组管理员。
我的基本模型是User -> usergroup(user; group; (bool)isAdmin) <-Group
有人能给出一个如何定义关系的简洁例子吗?
答案 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