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");
을 제거 :