3

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が常に空であることがわかりました。

コードの何が問題になっているのでしょうか。

純粋なEbeanの例をhttps://github.com/opensource21/ebean-samples/downloadsから入手できます。これは、ebeanのeclipse-pluginを使用しています。

4

1 に答える 1

3

この問題には2つの解決策があります。

PsceRoleでカスケードオプションを追加するだけです

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

そして、 cascade-solution-branchserver.saveManyToManyAssociations(result, "psecPermissions");で見つけたものを削除します。

cascaseを定義する必要がないため、よりクリーンなソリューション-おそらくそれは必要ありません。リストを置き換えずに、エントリをリストに追加するだけです。新しいものを追加し、古いものを削除することをお勧めします。これは次のことを意味しcreateOrUpdateRoleます:

result.getPsecPermissions().addAll(permissionObjects);

それ以外の

result.setPsecPermissions(permissionObjects);
于 2012-06-21T18:11:06.990 に答える