繁体   English   中英

Hibernate和Jersey中的LazyInitializationException

[英]LazyInitializationException in Hibernate and Jersey

嗨我正在使用Hibernate和Jersey做一个项目。

在服务层,我得到一个' LazyInitializationException '。 我搜索了很多关于它的信息。

我看到了创建自定义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);
}

例外情况表示您正在尝试加载一个不合适的惰性集合。 这意味着您需要在使用之前初始化集合对象。 初始化应该在实体setter方法或DAO类中进行。 通常不建议在实体的setter方法中初始化,因为它将您的实体与hibernate框架耦合。 所以最好的地方是DAO层。 但是我在这里提到的只是供你参考。 尝试这个

public void setMachineTemplates(Set<MachineTemplate> machineTemplates) {

    Hibernate.initialize(machineTemplates);
    this.machineTemplates = machineTemplates;
}

希望这有用!

尝试访问与持久性上下文分离的实体上的延迟获取的atttribute时,会出现LazyInitializationException。

这通常意味着当您访问lazy属性时,您的hibernate会话(/ JPA entityManager)已经关闭。

请参阅Struggling以了解EntityManager的正确用法

其实我不想加载machineTemplates数据。 所以我喜欢

public Set<MachineTemplate> getMachineTemplates() {

    if(Hibernate.isInitialized(machineTemplates))
        return machineTemplates;
    return null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM