0

User、Center、Profile という 3 つのエンティティがあるため、ユーザーは所属するセンターに応じて異なるプロファイルを持ちます。したがって、*user_center_profile* と呼ばれる 3 つのエンティティをリンクするテーブルがあります。

次に、プロファイルにリンクされた Permission と呼ばれる別のエンティティがあるため、プロファイルにはいくつかの権限があります。

メイン エンティティはユーザーであるため、次のようにマッピングします。

        @Entity
        @Table(name = "profile")
        public class Profile implements Serializable {

            @Id
            @GeneratedValue(strategy = GenerationType.AUTO)
            @Column(name = "idprofile")
            private Long idProfile;
            @Column(name = "codprofile")
            private String codProfile;
            @Column(name = "desprofile")
            private String desProfile;
            @OneToMany
            @JoinTable(name = "profile_permission", joinColumns = { @JoinColumn(name = "idProfile") }, inverseJoinColumns = { @JoinColumn(name = "idPermission") })
            private List<Permission> permissions = new ArrayList<Permission>();

            /* getters and setters */
        }

        @Entity
        @IdClass(CenterProfileId.class)
        @Table(name = "user_center_profile")
        public class CenterProfile implements Serializable {

            @Id
            @ManyToOne
            private Center center;
            @Id
            @ManyToOne
            private Profile profile;
            /* getters and setters */

        }

       @Embeddable
    public class CenterProfileId implements Serializable {

        private static final long serialVersionUID = 1L;
        @ManyToOne
        @JoinColumn(name = "idCenter")
        private Center center;
        @ManyToOne
        @JoinColumn(name = "idProfile")
        private Profile profile;

        /* getters, setters, equals, hashcode */
    }

   @Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "idUser")
    private Long idUser;
    @Column(name = "codUser")
    private String codUser;
    /* other properties */
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_center_profile", joinColumns = { @JoinColumn(name = "idUser") }, inverseJoinColumns = {
            @JoinColumn(name = "idCenter"), @JoinColumn(name = "idProfile") })
    private List<CenterProfile> centersProfileUser = new ArrayList<CenterProfile>();
    @Transient
    private Center selectedCenter;

    /* getters, setters */
}

問題は、ある時点で、特定のユーザーが持っているすべての権限を収集する必要があるということです...いくつかのことを試してみましたが、遅延読み込みエラー、セッションなしまたはセッション終了エラー、同時バッグの読み込みの問題が発生しました...

プレーンな SQL クエリを作成しようとしても、同じエラーが発生しました...

このために DetachedCriteria を作成する方法がわかりません。また、例外が発生するかどうかもわかりません..

私のアプリはさまざまな「センター」に接続できます。ログインすると、接続したいセンターを選択できますが、ログインすると、センターを変更することもできます...したがって、変更すると、権限を再計算する必要があります...そのため、そのアクセス許可のリストを取得する必要があります..

どうすればこれを適切な方法で行うことができますか?

4

1 に答える 1

0

最後に、次のようなクエリを作成しました。

HashSet<Permission> set = new HashSet<Permission>();
for (CenterProfile cp : usuario.getCentersProfileUsuario()) {
    // First we build subcriteria to return all the permissions for a certain profile
    DetachedCriteria criteriaProfile = DetachedCriteria
            .forClass(Profile.class);
    criteriaProfile.add(Restrictions.eq("idProfile", cp.getProfile()
            .getIdProfile()));
    criteriaProfile.createAlias("permissions", "permission");
    criteriaProfile.setProjection(Property.forName("permission.idPermission"));
    // Then we build criteria for permissions, which should match the results given by subcriteria
    DetachedCriteria criteria = DetachedCriteria
            .forClass(Permission.class);
    criteria.add(Property.forName("idPermission").in(criteriaProfile));
    List<Permission> permissions = getHibernateTemplate().findByCriteria(
            criteria);
    set.addAll(permissions);
}
于 2013-06-19T08:52:52.970 に答える