【问题标题】:LazyInitializationException in Hibernate and JerseyHibernate 和 Jersey 中的 LazyInitializationException
【发布时间】:2014-04-03 08:46:13
【问题描述】:

您好,我正在使用 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);
}

【问题讨论】:

  • 您能分享您的实体、服务层以获取更多详细信息吗?
  • @BalajiReddy 我更新了..
  • 与所有 getter 和 setter 方法共享您的 User 类。?
  • @Balaji 我使用 XML 完成了映射。
  • IMO 以低级 DAO 方法打开和关闭会话的事实是代码异味;这表明设计缺陷可能是您当前问题的核心。会话应该在更高的级别上处理,这样实体可以由 Hibernate 管理比单个方法调用更长的时间。

标签: java hibernate jaxb jersey


【解决方案1】:

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

public void setMachineTemplates(Set<MachineTemplate> machineTemplates) {

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

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    尝试访问与持久性上下文分离的实体上的延迟获取属性时,您会收到 LazyInitializationException。

    这通常意味着当你访问惰性属性时,你的休眠会话(/JPA entityManager)已经关闭了。

    Struggling to understand EntityManager proper use

    【讨论】:

      【解决方案3】:

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

      public Set<MachineTemplate> getMachineTemplates() {
      
          if(Hibernate.isInitialized(machineTemplates))
              return machineTemplates;
          return null;
      }
      

      【讨论】:

      • 在某些时候,必须在需要时初始化集合。初始化集合的唯一方法是在会话中。所以你必须保持会话活动直到你的操作结束并自己关闭它。但是这种实现会在访问集合时导致 NullPointerException。
      • 我测试了代码,它适用于所有情况...我们不会得到 NullPointerException。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2017-02-23
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多