当前位置: 首页 > 知识库问答 >
问题:

Spring Hibernate FetchType LazyInitializationException,即使不调用关联

邰棋
2023-03-14

我刚刚开始了解FetchType Lazy和Eager。我明白其中的区别,但即使我设置为Lazy,它仍然试图获取相关数据

关系:1人:多部手机

查看的研究尝试和教程:

https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ http://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/ https://howtoprogramwithjava.com/hibernate-eager-vs-lazy-fetch-type/

我知道要获取相关数据,我需要在会话()中执行此操作,因此对于Dao中的特定示例,我需要如下内容

  List<Person> persons = criteria.list();

    for(Person person : persons){

        Set sets = person.getPhones();

    }
    return persons;

目前为止正确吗?

但问题是我没有给那个人打电话。getPhones()不在Dao、controller中的任何位置。。等等,但我有一个懒散的初始化选项。因为我的生活似乎无法理解什么是错的。

堆栈跟踪

Jun 19, 2017 2:24:01 PM org.apache.catalina.core.StandardWrapperValve invoke
 SEVERE: Servlet.service() for servlet [app-dispatcher] in context with path 
 [/uni-starter-onetomany] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.app.person.Person.phones, could not initialize proxy - no Session] with root cause
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.app.person.Person.phones, could not initialize proxy - no Session

人班

@Entity
@Table(name="person")
@Component
public class Person {

@Id
@GeneratedValue
private int person_id;

private String name;

private String age;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
private Set<Phone> phones;

//  Getter and setters

// ToString method by field name not by method

电话班

@Entity
@Table(name="phone")
@Component
public class Phone {

@Id
@GeneratedValue
private int phone_id;

private String type;

private String phone;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="person_person_id")
private Person person;

//  Getter and setters

潘松道

    @Repository
 @Transactional
 @Component("personDao")
 public class PersonDao {

@Autowired
private SessionFactory sessionFactory;

public Session session(){
    return sessionFactory.getCurrentSession();
}

public List<Person> getPersonList(){
    Criteria criteria = session().createCriteria(Person.class);

    List<Person> persons = criteria.list();

    //  for(Person person : persons){
    //
    //    Set sets = person.getPhones();
    //
    //  }

    return persons;
}


public void saveOrUpdate(Person person){
    session().saveOrUpdate(person);
}

}

控制器

    // Get list
@RequestMapping(path="/list", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Map<String, Object> getListPerson(){

    Map<String, Object> data = new HashMap<String, Object>();

    List<Person> persons = personDao.getPersonList();       

    data.put("results", persons);

    System.out.println(persons);

    return data;
}

问题

>

我还看到人们设置FetchMode()FetchMode。加入道类,例如Hibernate Criteria加入3个表,也许这可能是主观的,但什么是更好的做法?任何性能问题?

非常感谢您的任何想法、链接或文章。。。

由于Abassa亲自将Phone in从toString中移除,因此进行了更新。类修复了该问题。但我刚刚意识到,由于Jackson的原因,在序列化过程中,它试图获取电话ojbect。。。。是否有变通方法?

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: failed to lazily initialize a collection of role: com.app.person.Person.phones, could not initialize proxy - no Session

共有1个答案

高祺
2023-03-14

从Person类中的toString方法中删除phones字段。

打电话时:

System.out.println(persons);

您尝试访问电话字段,因为println为列表中的每个人调用toString方法,因此您会得到LazyLaunalizationException。

 类似资料:
  • 我正面临一个让我发疯的问题。 我尝试在onDestroyView()中删除观察者,它可以工作,观察者被删除,但是一旦片段再次进入onActivityCreated()中,并且我观察到livedata,观察者就会立即被触发...我总是使用“ViewLifecyCleOwner”作为所有者。 如果我返回实例化片段,是否有任何方法可以取消liveData的执行? 我所有的frag都扩展了ScopeFra

  • 想改进这个问题吗?更新问题,让它只通过编辑这篇文章来关注一个问题。 我目前正在一个android项目中工作。谁能告诉我WhatsApp如何处理显示呼叫通知屏幕,即使应用程序被杀死,手机被锁定?

  • 问题内容: 与MySQL的Hibernate连接未关闭。在大约10秒钟内单击10次后,我从MySQL Workbench(在我的开发机中。我是唯一的用户)获得此连接统计信息。MySQL Workbench Server状态 我已经准备好了 C3P0并正在运行(从log4j中检查,与C3P0相关的问题没有问题,似乎正在运行) 一个ServletReqestListener,它检查是否存在打开的会话,

  • 问题内容: 我在设置时遇到问题,我的登录名已通过验证,但未调用execute函数 LoginAction.java: struts.xml: login.jsp: 我只能看到“ 4”被打印(意味着它已通过验证),仅此而已,它并没有转到“ 5” 编辑: 添加了代码段 问题答案: 从Struts2 Spring插件文档中: 通常,在struts.xml中,为每个Action指定类。使用default时

  • 问题内容: 我正在学习如何在Android中使用线程,并且为此,我制作了一个播放一系列笔记的小型应用程序。这个想法是,有一个开始按钮和一个结束按钮,(显然)如果您按下开始按钮,它将开始播放音乐,而如果您按下结束按钮,它将停止播放。开始按钮可以正常工作,但是问题是结束按钮不能正常工作。我在找出原因时遇到了麻烦,因此也许有些人可以帮助我。这是代码: 问题答案: 您正在调用正在播放的线程,但此时可能正在

  • 重试时间:io.reactivex.subjects.serializedsubject@35fb3008 subscribeNext 进程已完成,退出代码为0