我的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时无法控制会话。
你有解决这个问题的方法吗?提前谢谢。