2012-05-30 77 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);