2012-11-16 14 views
9

Sto lavorando con l'ultima versione di playframework (2.0.4) e l'EbM ORM. Ecco il mio schema db semplificatoEbean - Chiave primaria composita che contiene chiavi esterne

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

vorrei creare i miei modelli di entità, in questo modo:

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

è giusto per te. E se è ok per questa tabella intermedia, per quanto riguarda l'entità Utente e Gruppo? Grazie in anticipo.

+0

Mapping saggio, questo va bene. Ma buona fortuna con fare un cercatore per questa classe. Non sono mai riuscito a far funzionare normalmente gli Ebean con le chiavi composite. – kaqqao

risposta

4

Alcune annotazioni non sembrano corrette ma potrebbero funzionare comunque.

Se fossi in te farei:

@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; 

Per la colonna ManyToOne:

@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 

Nella tua entità User avete bisogno di qualcosa di simile:

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

Quando si esegue trovare, è come

// find all users within a certain group 
Ebean.find(User.class) 
    .fetch("groups") 
    .where().eq("groups.groupId", "...").findList(); 
Problemi correlati