【问题标题】:facing failed to lazily initialize a collection and could not initialize proxy - no Session面对无法延迟初始化集合并且无法初始化代理 - 没有会话
【发布时间】:2019-09-06 12:12:53
【问题描述】:

当我从 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;

}


【问题讨论】:

    标签: java hibernate spring-boot jpa


    【解决方案1】:

    This describes what you need basically

    org.hibernate.LazyInitializationException 表示相关实体或实体集合,在您的情况下为 roles ,尚未初始化,因为相关实体的默认获取策略是 LAZY

    要解决此问题,您必须在获取 ops_user_login 实体后初始化 roles 集合,或者如果您已经使用查询来获取实体,则可以通过查询获取它们。可以使用Hibernate.initialize(entity.getRoles()) 初始化roles,如果这不起作用,您也可以调用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);
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 2018-11-21
      • 2014-12-23
      • 1970-01-01
      • 2020-03-18
      • 2021-03-13
      • 2022-07-08
      • 2016-07-06
      • 2015-07-02
      相关资源
      最近更新 更多