gpt4 book ai didi

many-to-many - 如何使用 Ebean 处理单向多对多关系

转载 作者:行者123 更新时间:2023-12-02 00:21:20 25 4
gpt4 key购买 nike

我对 Ebean 有疑问。我有常用的对象 PsecUser、PsecRoles 和 PsecPermission。一个用户可以有很多权限或角色,一个角色可以有很多权限。这里的代码(摘录):

@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-plugin。

最佳答案

这个问题有两种解决方案:

只需在 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);

关于many-to-many - 如何使用 Ebean 处理单向多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10812574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com