3

1 つのテーブルの複数の行を 1 つのエンティティにマップする最良の方法を探しています。私が持っているデータベーステーブルを以下に示します。

principal_id    permission    target
12312313        PERM1         1000
12312313        PERM2         1000
12312313        PERM2         1002

理想的には、次のように、このテーブルの内容をフィールドとしてプリンシパル @Entity にマップしたいと考えています。

@Entity
...
public class Principal {
    @Id
    private long principalId;

    ...

    private Map<String, List<Long>> permissionMap;

}

そうするための最良の方法は何ですか?

4

2 に答える 2

3

あなたが望むことを正確に行う方法がわかりません。私が得ることができる最も近いものは次のとおりです。

@Embeddable
public class Permission {
    private String permission;
    private int target;
}

@ElementCollection
@CollectionTable(name="foo", joinColumns = @JoinColumn(name = "principal_id"))
private Set<Permission> permissions;

ターゲットごとに 1 つの権限しかない場合は、マップを使用できます。

@ElementCollection
@CollectionTable(name="foo", joinColumns = @JoinColumn(name = "principal_id"))
@MapKeyColumn(name="permission")
@Column(name="target")
private Map<String, Integer> permissions;

残念ながら、コレクションを含むマップに対してこれを行う方法はないと思います。

于 2012-10-10T00:14:09.960 に答える
-1

次の構造をお勧めします。

@Entity
...
public class Principal {

    @Id
    private long principalId;
    /** Other properties **/
    @OneToMany
    private Set<Permission> permissions;
....
}

@Entity
@IdClass(PermissionId.class)
public class Permission {
    @Id
    private String permission;
    @Id
    private Long target

    public static class PermissionId implements Serializable {
        private String permission;
        private Long target;
        /** setters/getters hashcode and equals goes here **/
    }
}
于 2012-10-09T23:57:38.160 に答える