Google App Engine에 대해서는 잘 모르지만 JPA를 도울 수는 있습니다.
"isAdmin"열은 데이터 모델이 조인자 테이블과의 @ManyToMany 관계가되는 것을 방지합니다.
데이터 모델에서 key = Group 및 value = isAdmin을 사용하여 User 엔터티에 대한 맵이 필요합니다. 비슷하게 그룹 엔터티에 해당 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이고, 다른 주석 그냥 콜렉션 테이블의 특정 컬럼의 이름을 지정하고 그들은 모두에서 일치 확인하다 entities : @CollectionTable은 테이블의 이름과 현재 엔티티의 id를 나타내는 열의 이름을 제공합니다. @MapKeyJoinColumn은 Map의 "key"요소의 id를 나타내는 열 이름을 제공하고 @Column은지도에서 "value"요소의 이름을 제공합니다.
엔티티 중 하나에서 insertable = false 및 falseatable = false가 필요한지 확실하지 않지만 사용자와 그룹 사이의 순환 종속성으로 인해 중복 행을 추가하지 않아도됩니다.
또한 적어도 collectionink는 두 개의 "groupId"및 "isAdmin"열을 사용하여이를 작성하려고하기 때문에 콜렉션 테이블을 수동으로 작성해야합니다. 사용자와 그룹 사이의 주기적 종속성이 절대적으로 필요한 경우 디자인 검토를 고려할 수 있습니다.
UserGroup에 여러 사용자가 있어야하는 이유를 알지 못합니다. List, 누가 관리자인지 어떻게 알 수 있습니까? – johnymachine
사용자가 userGroup을 사용하지 않는 이유가 확실하지 않습니다. 하지만 사용자 userGroup admin의 사용자 목록에 해당 사용자가 있는지 확인할 수 있습니다. –