您好我正在使用Hibernate和Jersey进行项目。
在服务层,我收到了“ LazyInitializationException ”。我搜索了很多关于它的信息。
我看到了creating custom AccessorType的解决方案。但我仍然是例外。
任何人都可以帮助我吗?
我要提供更多相关细节。
Bean:用户
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlAccessorFactory(XmlAccessorFactoryImpl.class)
public class User {
private String userName;
private String password;
private String email;
private String fname;
private String lname;
private Set<MachineTemplate> machineTemplates;
private String photoUrl;
public User() {
machineTemplates = new HashSet<>();
}
public User(String userName) {
this.userName = userName;
}
public User(String userName, String password, String email, String fname,
String lname) {
this.userName = userName;
this.password = password;
this.email = email;
this.fname = fname;
this.lname = lname;
this.machineTemplates = new HashSet<>();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public Set<MachineTemplate> getMachineTemplates() {
return machineTemplates;
}
public void setMachineTemplates(Set<MachineTemplate> machineTemplates) {
this.machineTemplates = machineTemplates;
}
public String getPhotoUrl() {
return photoUrl;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
}
DAO图层方法
public User get(String uName) {
Session session = getSessionFactory().openSession();
User u = (User) session.get(User.class, uName);
session.close();
}
服务层方法
@GET
@Path("/{userName}")
@Produces(MediaType.APPLICATION_JSON)
public User getUserInfo(@PathParam("userName") String userName) {
return userHelper.getUser(userName);
}
答案 0 :(得分:2)
该异常表示您正在尝试加载一个不在会话中的惰性集合。这意味着您需要在使用之前初始化集合对象。初始化应该在实体setter方法或DAO类中进行。通常不建议在实体的setter方法中初始化,因为它将您的实体与hibernate框架耦合。所以最好的地方是DAO层。但是我在这里提到的只是供你参考。 试试这个
public void setMachineTemplates(Set<MachineTemplate> machineTemplates) {
Hibernate.initialize(machineTemplates);
this.machineTemplates = machineTemplates;
}
希望这有用!
答案 1 :(得分:0)
尝试访问与持久性上下文分离的实体上的延迟获取的atttribute时,会出现LazyInitializationException。
这通常意味着当您访问惰性属性时,您的休眠会话(/ JPA entityManager)已经关闭。
答案 2 :(得分:0)
其实我不想加载machineTemplates数据。所以我确实喜欢
public Set<MachineTemplate> getMachineTemplates() {
if(Hibernate.isInitialized(machineTemplates))
return machineTemplates;
return null;
}