EJB + Hibernate + REST客户端LazyInitializationException

时间:2017-04-30 10:13:51

标签: java hibernate rest ejb lazy-initialization

我的REST客户端正在工作,直到我为持久性添加了Hibernate,然后每当我发出请求时,我都会收到错误500,并显示以下消息:

  

无法懒惰地初始化角色集合:uo.sdi.dto.User.tasks,无法初始化代理 - 无会话。

我一直在阅读很多关于这个主题的答案,但在这种情况下都没有发生。当我调用“FindLoggableUser”方法以检查用户是否可以登录时,错误会升起。

FindLoggableUser

User user = Factories.persistence.getUserDao().findByLoginAndPassword(login, password);

FindByLoginAndPassword

User res = Jpa.getManager()
              .createQuery(Jdbc.getSqlQuery("USER_FIND_BY_LOGIN_AND_PASSWORD")
              ,User.class).setParameter(1, login).setParameter(2, password)
              .getSingleResult();
return res;

Jpa.java

public class Jpa {

    private static ThreadLocal<EntityManager> emThread = 
        new ThreadLocal<EntityManager>();

    public static EntityManager getManager() {
        EntityManager entityManager = emThread.get();
        if (entityManager == null) {
            entityManager = jndiFind("java:/GtdJpaEntityManager");
            emThread.set(entityManager);
        }
        return entityManager;
    }

    private static EntityManager jndiFind(String name) {
        Context ctx;
        try {
            ctx = new InitialContext();
            return (EntityManager) ctx.lookup(name);
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }
    }
}

我的用户类

User.java

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(unique = true, nullable = false)
private String login;
@Column(unique = true, nullable = false)
private String email;
private String password;
private Boolean isAdmin = false;

@Enumerated(EnumType.STRING)
private UserStatus status = UserStatus.ENABLED;

@OneToMany(mappedBy="user")
private Set<Task> tasks = new HashSet<Task>();

@OneToMany(mappedBy="user")
private Set<Category> categories = new HashSet<Category>();

这些是我的类的属性,并且在尝试访问tasks集合时出现错误:

public Set<Task> getTasks(){
    return new HashSet<Task>(tasks);
}

我已经尝试将初始化设置为急切但它也失败了。关于其他问题,有些人建议手动控制会话以获得每个请求模式的会话方法,但我还读到在使用EntityManager时无法控制会话。

你有解决这个问题的方法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您必须为馆藏配置lazy

在你的情况下是为了任务。