2012-11-16 32 views
9

私はplayframework(2.0.4)とEbean ORMの最後のリリースで作業しています。Ebean - 外部キーを含むコンポジットプライマリキー

@Entity 
public class UserGroup extends Model { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    public UserGroupPK pk; 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id", insertable = false, updatable = false) 
    public User user; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "group_id", insertable = false, updatable = false) 
    public Group group; 
} 

@Embeddable 
public class UserGroupPK implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    public Long userId; 
    public Long groupId; 

    public UserGroupPK(Long userId, Long groupId) { 
     this.userId = userId; 
     this.groupId = groupId; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final UserGroupPK other = (UserGroupPK) obj; 
     if ((this.userId == null) ? (other.userId != null) : !this.userId.equals(other.userId)) { 
       return false; 
      } 
     if ((this.groupId == null) ? (other.groupId != null) : !this.groupId.equals(other.groupId)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 89 * hash + (this.userId != null ? this.userId.hashCode() : 0); 
     hash = 89 * hash + (this.groupId != null ? this.groupId.hashCode() : 0); 
     return hash; 
    } 
} 

が、それはあなたのために右です:ここに は、私はこのように、私のエンティティモデルを作成したいと思い、私の簡素化DBスキーマ

TABLENAME (FIELD_NAME (, ...)) 
User (id) 
Group (id) 
UserGroup (user_id, group_id, is_active) 

です。そして、この中間テーブルであれば、ユーザーとグループのエンティティはどうですか?前もって感謝します。

+0

地図の作成は賢明です。しかし、このクラスのためのファインダーを作ることに幸運。私はEbeansをコンポジットキーで正常に動作させることはできませんでした。 – kaqqao

答えて

4

一部の注釈は正しく表示されませんが、とにかく動作する可能性があります。

私があなただったら、私はどうなる:ManyToOne列の場合

@Embeddable 
public class UserGroupPK implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    @Column(name = "user_id") 
    public Long userId; 
    @Column(name = "group_id") 
    public Long groupId; 

:あなたは

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
public Set<UserGroup> groups 

:あなたのUserエンティティで

@ManyToOne 
@JoinColumn(name = "user_id", referenceColumnName = "id", nullable = false) // insertable and updatable by default are true, which I think are correct here 
public User user; 

// same for group 

あなたのようなものが必要見つける、それはのように

// find all users within a certain group 
Ebean.find(User.class) 
    .fetch("groups") 
    .where().eq("groups.groupId", "...").findList(); 
関連する問題