2013-04-25 2 views
0

나는 이것에 완전히 새로운 것으로, 어리석은 질문이라면 유감입니다.GAE jpa 데이터베이스 모델 예

JPA에서 Google App Engine을위한 데이터베이스 모델을 설계하려고하지만 올바르게 진행할 수 없습니다. 내가 길을 찾으면 주석을 올바르게 얻을 수 없거나 Google App Engine에서 지원되지 않는 M : N에 대한 오류가 발생합니다.

엔티티 사용자가 여러 개의 그룹을 가질 필요가 있고 그룹에 여러 명의 사용자가 있고 그룹 관리자 인 사용자가 있습니다.

내 기본 모델이었다 User -> usergroup(user; group; (bool)isAdmin) <-Group

누군가가 관계를 정의하는 방법에 깨끗하고 간단한 예를 주실 수 있습니까?

답변

0

시도해보십시오.

@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>(); 
} 

GAE 당신이 읽을 수있는 JPA에 제한이주의하시기 바랍니다 더

+0

UserGroup에 여러 사용자가 있어야하는 이유를 알지 못합니다. List, 누가 관리자인지 어떻게 알 수 있습니까? – johnymachine

+0

사용자가 userGroup을 사용하지 않는 이유가 확실하지 않습니다. 하지만 사용자 userGroup admin의 사용자 목록에 해당 사용자가 있는지 확인할 수 있습니다. –

0

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"열을 사용하여이를 작성하려고하기 때문에 콜렉션 테이블을 수동으로 작성해야합니다. 사용자와 그룹 사이의 주기적 종속성이 절대적으로 필요한 경우 디자인 검토를 고려할 수 있습니다.

+0

here 귀하의 답변을 주셔서 감사합니다,하지만 난 ManyToMany 모델을 시도하고 지원되지 않는 예외했습니다. – johnymachine

+0

ManyToMany 관계에 "isAdmin"열을 갖는 방법을 상상할 수 없습니다. 테이블과 관계형 모델을 잊어 버리고 필요한 객체 모델 만 신경 쓰면 Java 클래스는 어떻게 생겼을까요? – German