2012-05-30 7 views
3

Ebean에 문제가 있습니다. 나는 보통의 개체 PsecUser, PsecRoles 및 PsecPermission을 가지고있다. 사용자는 많은 권한 또는 역할을 가질 수 있으며 역할은 많은 권한을 가질 수 있습니다. 여기 코드 (발췌) : 실패Ebean과의 단방향 다 대다 관계를 처리하는 방법

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

는이 수를 확인하는 경우 :

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

다음과 같은 테스트를 시도 :

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

} 

나는 다음과 같은 도우미-방법을 썼다 읽은 역할의 사용 권한 항상 0입니다. 데이터베이스를 조사한 결과 psec_role_psec_permission이 항상 비어 있음을 알았습니다.

코드에 어떤 문제가 있습니까?

https://github.com/opensource21/ebean-samples/downloads에서 ebean의 eclipse-plugin을 사용하여 순수한 Ebean 예를 얻을 수 있습니다.

단순히 PsceRole

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

에서 캐스케이드 옵션을 추가하고 cascade-solution-branch에서 찾을 server.saveManyToManyAssociations(result, "psecPermissions");을 제거 :

답변

3

은이 문제에 대한 두 가지 솔루션이 있습니다.

캐스터를 정의 할 필요가 없기 때문에 클리너 솔루션이 필요하지 않을 수도 있습니다. 그냥 목록을 바꾸지 말고 목록에 항목을 추가하기 만하면됩니다. 새 항목을 추가하고 이전 항목을 제거하는 것이 좋습니다. createOrUpdateRole에있는이 평균 :

result.getPsecPermissions().addAll(permissionObjects); 

대신

result.setPsecPermissions(permissionObjects);