接线问题。 org.hibernate.LazyInitializationException: 延迟初始化集合失败

Issue of wiring. org.hibernate.LazyInitializationException: failed to lazily initialize a collection

我在尝试 getUserRole() 时发现了一些异常

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/index.jsp at line 19

16: }
17: */
18: User user = (User)request.getAttribute("list");
19: out.print(user.getLogin() + " : " + user.getPassword() + " : " + user.getUserRole());
20: %>

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myproject.User.userRole, could not initialize proxy - no Session
    org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
    org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
    org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
    org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
    org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:316)
    java.lang.String.valueOf(String.java:2847)
    java.lang.StringBuilder.append(StringBuilder.java:128)
    org.apache.jsp.WEB_002dINF.jsp.index_jsp._jspService(index_jsp.java:90)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

这里是我的注释类:

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

    private static final long serialVersionUID = 1L;

    private String login;
    private String password;
    private String email;
    private boolean enabled;
    private Set<UserRole> userRole = new HashSet<UserRole>(0);

    public User(){}
    public User(String login, String password, String email, boolean enabled){
        this.login = login;
        this.password = password;
        this.email = email;
        this.enabled = enabled;
    }
    public User(String login, String password, String email, boolean enabled, Set<UserRole> userRole){
        this.login = login;
        this.password = password;
        this.email = email;
        this.enabled = enabled;
        this.userRole = userRole;
    }

    @Id
    @Column(name="login", unique=true, nullable=false, length = 50)
    public String getLogin(){
        return this.login;
    }

    public void setLogin(String login){
        this.login = login;
    }

    @Column(name="password", nullable = false, length = 50)
    public String getPassword(){
        return this.password;
    }

    public void setPassword(String password){
        this.password = password;
    }

    @Column(name = "email", nullable = false, length = 100)
    public String getEmail(){
        return this.email;
    }

    public void setEmail(String email){
        this.email = email;
    }

    @Column(name = "enabled", nullable = false)
    public boolean isEnabled(){
        return this.enabled;
    }

    public void setEnabled(boolean enabled){
        this.enabled = enabled;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    public Set<UserRole> getUserRole(){
        return this.userRole;
    }

    public void setUserRole(Set<UserRole> userRole){
        this.userRole = userRole;
    }

}

    @Entity
    @Table(name="user_roles", uniqueConstraints = @UniqueConstraint(columnNames = {"role","login"}))
    public class UserRole implements Serializable{

        private static final long serialVersionUID = 1L;

        private int roleId;
        private User user;
        private String role;

        public UserRole(){}
        public UserRole(User user, String role){
            this.user = user;
            this.role = role;
        }

        @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "role_id", unique = true, nullable = false)
        public int getRoleId(){
            return this.roleId;
        }

        public void setRoleId(int roleId){
            this.roleId = roleId;
        }

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "login", nullable = false)
        public User getUser(){
            return this.user;
        }

        public void setUser(User user){
            this.user = user;
        }

        @Column(name = "role", nullable = false)
        public String getRole(){
            return this.role;
        }

        public void setRole(String role){
            this.role = role;
        }

    }

并结束我的 DAO:

@Override
    @Transactional
    @SuppressWarnings("unchecked")
    public User findByLogin(String login){
        String query = "from User where login = ?";
        List<User> listUser = sessionFactory.getCurrentSession().createQuery(query).setParameter(0, login).list();

        if(listUser.size() > 0)
            return listUser.get(0);
        else
            return null;
    }

必须在没有 user.getUserRole() 的情况下标记 jsp 效果很好,但是当我新插入此方法片段时,我再次看到错误。同样在这个项目中实现了SpringSecurity,但是没有用"sign in"。我想问题是一样的

您可以从 LAZY to EAGER

更改
   fetch = FetchType.EAGER

或使用Hibernate.intialize()初始化集合userRole

 if(listUser.size() > 0)
           User user = listUser.get(0);
Hibernate.initialize(user.getUserRole());
        else
            return null;