Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射和查询此实体的最佳方法_Java_Spring_Hibernate_Orm - Fatal编程技术网

Java 映射和查询此实体的最佳方法

Java 映射和查询此实体的最佳方法,java,spring,hibernate,orm,Java,Spring,Hibernate,Orm,我有三个实体用户,中心和个人资料,所以用户根据他所在的中心有不同的个人资料。因此,我们有一个表,它链接了三个实体,称为*user\u center\u profile* 然后我们有另一个实体,叫做Permission,它链接到Profile,所以Profile有几个权限 因为主实体是用户,所以我将其映射为: @Entity @Table(name = "profile") public class Profile implements Serial

我有三个实体用户,中心和个人资料,所以用户根据他所在的中心有不同的个人资料。因此,我们有一个表,它链接了三个实体,称为*user\u center\u profile*

然后我们有另一个实体,叫做Permission,它链接到Profile,所以Profile有几个权限

因为主实体是用户,所以我将其映射为:

        @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 */
}
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);
}
@实体
@表(name=“profile”)
公共类配置文件实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“idprofile”)
私人长文件;
@列(name=“codprofile”)
私有字符串配置文件;
@列(name=“desprofile”)
私有字符串文件;
@独身癖
@JoinTable(name=“profile\u permission”,joinColumns={@JoinColumn(name=“idProfile”)},inverseJoinColumns={@JoinColumn(name=“idPermission”)})
私有列表权限=新建ArrayList();
/*接球手和接球手*/
}
@实体
@IdClass(CenterProfileId.class)
@表(name=“用户\中心\档案”)
公共类CenterProfile实现可序列化{
@身份证
@许多酮
私人中心;
@身份证
@许多酮
个人资料;
/*接球手和接球手*/
}
@可嵌入
公共类CenterProfileId实现可序列化{
私有静态最终长serialVersionUID=1L;
@许多酮
@JoinColumn(name=“idCenter”)
私人中心;
@许多酮
@JoinColumn(name=“idProfile”)
个人资料;
/*getter、setter、equals、hashcode*/
}
@实体
@表(name=“user”)
公共类用户实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“idUser”)
专用长idUser;
@列(name=“codUser”)
私有字符串编码用户;
/*其他属性*/
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“user\u center\u profile”,joinColumns={@JoinColumn(name=“idUser”)},inverseJoinColumns={
@JoinColumn(name=“idCenter”),@JoinColumn(name=“idProfile”)}
私有列表中心sprofileuser=new ArrayList();
@短暂的
私人中心选择中心;
/*能手,二传手*/
}
问题是,在某一点上,我必须收集某个用户拥有的所有权限。。。我尝试了几种方法,但都出现了延迟加载错误、无会话或会话关闭错误、同时加载包时出现问题

我甚至试着写一个简单的SQL查询,但我得到了同样的错误

我看不到为此构建DetachedCriteria的方法,我不知道它是否也会给出一个例外

我的应用程序可以连接到不同的“中心”,当他登录时,他可以选择要连接的中心,但一旦登录,他也可以更改中心。。。所以当他更改它时,我必须重新计算他的权限。。。这就是为什么我需要获得权限列表


如何以适当的方式完成此操作?

最后,我构建了如下查询:

        @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 */
}
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);
}
HashSet=newhashset();
对于(CenterProfile cp:usuario.getCentersProfileUserario()){
//首先,我们构建子标准以返回特定概要文件的所有权限
DetachedCriteriaProfile=DetachedCriteria
.forClass(Profile.class);
criteriaProfile.add(Restrictions.eq(“idProfile”,cp.getProfile())
.getIdProfile());
createAlias(“权限”、“权限”);
setProjection(Property.forName(“permission.idPermission”);
//然后,我们为权限建立标准,该标准应与子标准给出的结果相匹配
DetachedCriteria=DetachedCriteria
.forClass(Permission.class);
在(criteriaProfile)中添加(Property.forName(“idPermission”);
列表权限=getHibernateTemplate().findByCriteria(
标准);
set.addAll(权限);
}

如果您正在计算权限,是否考虑过使用Spring Security重新设计并让它管理您的权限?我正在使用Spring Security,但我不知道如何使用它处理中心的更改。。。