当前位置: 首页 > 知识库问答 >
问题:

Facting未能懒惰地初始化集合,无法初始化代理-没有会话

谭绍晖
2023-03-14

当我从angular发送post请求时,在spring boot requestfilter程序中,验证jwt令牌时显示错误。

面对问题org.hibernate.lazyInitializationException:

未能懒惰地初始化角色集合:in.yis.mains.model.opsuserslogin.roles,无法初始化代理-没有会话

import java.util.Date;
import java.util.LinkedHashSet;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.JoinTable;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import javax.persistence.UniqueConstraint;

import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.Data;

@Data
@Entity
@Table(
        name="ops_users_login",
        uniqueConstraints={@UniqueConstraint(columnNames={"username"})}
    )
public class OpsUsersLogin {

    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    private long id;

    private String name;

    @Column(name="username")
    private String username;

    private String password;

    private String oldPassword;

    private String status_flag;

    private int wrong_attampts;

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date created_date;

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date expiry_date;


    private long rights;

    private String address;

    private String designation;

    private long empId;

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date created_by;

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date updated_by;

    @ManyToMany
    @JoinTable( 
        name = "opsUsersLogin_roles", 
        joinColumns=@JoinColumn(name = "user_id", referencedColumnName = "id"), 
        inverseJoinColumns=@JoinColumn(name = "role_id", referencedColumnName = "id")) 
    private Collection<Role> roles;

}


共有1个答案

西门经国
2023-03-14

这描述了您基本上需要什么

org.hibernate.lazyInitializationException意味着相关实体或实体集合(在本例中为roles)尚未初始化,因为相关实体的默认获取策略是lazy

要解决这个问题,您必须在获取ops_user_login实体后初始化roles集合,或者您可以通过查询获取它们,如果您已经使用查询来获取您的实体的话。初始化角色可以使用hibernate.initialize(entity.getroles())完成,如果不起作用,也可以调用entity.getroles().size()作为解决办法。

如果使用查询选择ops_user_login,则可以执行以下操作:

Query query = session.createQuery(
    "from ops_user_login o " +
    "join fetch o.roles"
); 

TypedQuery<OpsUsersLogin> query = entityManager.createQuery("Select o from ops_user_login o join fetch o.roles", OpsUsersLogin.class);
 类似资料: