2012-05-30 83 views
3

我與Ebean有問題。我有通常的Objects PsecUser,PsecRoles和PsecPermission。 用戶可以擁有許多權限或角色,角色可以擁有許多權限。 這裏的代碼(摘錄):如何處理與Ebean的單向多對多關係

@Entity 
public class PsecPermission { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(unique=true, nullable=false) 
    private String name; 

    @Column(nullable=false) 
    private String type = PsecBasicPermission.class.getName(); 

    @Column(nullable=false) 
    private String target; 

    @Column(nullable=false) 
    private String actions; 

} 


@Entity 
public class PsecRole { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(unique=true, nullable=false) 
    private String name; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastUpdate; 

    @ManyToMany(fetch=FetchType.EAGER) 
    private List<PsecPermission> psecPermissions; 

    private boolean defaultRole = false; 

} 

我寫了下面的輔助性方法:

public PsecRole createOrUpdateRole(String name, boolean defaultRole, String... permissions) { 
     PsecRole result = server.find(PsecRole.class). 
       where().eq("name", name).findUnique(); 
     if (result == null) { 
      result = new PsecRole(); 
      result.setName(name); 
     } 
     final List<PsecPermission> permissionObjects = server.find(PsecPermission.class). 
       where().in("name", (Object[])permissions).findList(); 
     result.setPsecPermissions(permissionObjects); 
     result.setDefaultRole(defaultRole); 
     final Set <ConstraintViolation <PsecRole>> errors = 
       Validation.getValidator().validate(result); 
     if (errors.isEmpty()) { 
      server.save(result); 
      server.saveManyToManyAssociations(result, "psecPermissions"); 
     } else { 
      log.error("Can't save role: " + name +"!"); 
      for (ConstraintViolation <PsecRole> constraintViolation : errors) { 
       log.error(" " + constraintViolation); 
      } 
     } 
     return result; 
} 

,並嘗試下面的測試:

@Test 
public void testCreateOrUpdateRole() { 
    String[] permNames = {"Test1", "Test2", "Test3"}; 
    List <PsecPermission> permissions = new ArrayList <PsecPermission>(); 
    for (int i = 0; i < permNames.length; i++) { 
     helper.createOrUpdatePermission(permNames[i], "target"+ i, "actions" +i); 
     PsecPermission perm = server.find(PsecPermission.class).where().eq("name", permNames[i]).findUnique(); 
     assertThat(perm.getTarget()).isEqualTo("target" + i); 
     assertThat(perm.getActions()).isEqualTo("actions" + i); 
     permissions.add(perm); 
    } 

    PsecRole orgRole = helper.createOrUpdateRole(ROLE, false, permNames); 
    testRole(permNames, orgRole); 
    PsecRole role = server.find(PsecRole.class).where().eq("name", ROLE).findUnique(); 
    testRole(permNames, role); 

} 
private void testRole(String[] permNames, PsecRole role) { 
    assertThat(role).isNotNull(); 
    assertThat(role.getName()).isEqualTo(ROLE); 
    assertThat(role.isDefaultRole()).isEqualTo(false); 
    assertThat(role.getPermissions()).hasSize(permNames.length); 
} 

從而未能如果它檢查的數量相關角色的權限。它總是0. 我看着數據庫,發現psec_role_psec_permission一直是空的。

任何想法有什麼問題的代碼?

您可以從https://github.com/opensource21/ebean-samples/downloads獲得一個純Ebean示例,它使用ebean的eclipse插件。

回答

3

有此問題的兩個解決方案:

只需在PsceRole

@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
private List<PsecPermission> psecPermissions; 

添加級聯選項,刪除server.saveManyToManyAssociations(result, "psecPermissions");你覺得它在cascade-solution-branch

更乾淨的解決方案,因爲您不需要定義cascase,也許您不需要它: 只是不要替換列表,只需將您的條目添加到列表中即可。最好是添加新的並刪除舊的。這意味着在createOrUpdateRole

result.getPsecPermissions().addAll(permissionObjects); 

,而不是

result.setPsecPermissions(permissionObjects);