懒加载hibernate,正确的做法和一些疑惑
Lazy loading hibernate, the correct way and some doubts
我想知道为什么这两种延迟加载方法之间存在一些差异(因为我期望得到相同的结果),这两种方法都使用 lazy=true 和 fetch="select"
接近号 1
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
//the Subject entity is Many to One relation
model.addAttribute("subject", i.getSubject());
在这种方法中,当我尝试访问 "subject" 时出现错误,错误是 "org.hibernate.LazyInitializationException: could not initialize proxy - no Session"(这是堆栈跟踪 https://pastebin.com/3fdDKCV0)
方法数 2
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
Subject s = (Subject) miasession.get(Subject.class, i.getSubject().getId());
//the Subject entity is Many to One relation
model.addAttribute("subject", s);
这个可行,但我不知道为什么以前的方法不起作用
PS:这是一段伪代码,交易是在这个方法之外处理的,我只报告了一些代码来说明问题:)
如果你不想得到第一种方法的错误,你可以使用这样的东西:
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
// load the collection before session is closed
model.addAttribute("subject", Hibernate.initialize(i.getSubject()));
另一种解决惰性问题的方法是在 web.xml
中使用 OpenSessionInViewFilter
我想知道为什么这两种延迟加载方法之间存在一些差异(因为我期望得到相同的结果),这两种方法都使用 lazy=true 和 fetch="select"
接近号 1
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
//the Subject entity is Many to One relation
model.addAttribute("subject", i.getSubject());
在这种方法中,当我尝试访问 "subject" 时出现错误,错误是 "org.hibernate.LazyInitializationException: could not initialize proxy - no Session"(这是堆栈跟踪 https://pastebin.com/3fdDKCV0)
方法数 2
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
Subject s = (Subject) miasession.get(Subject.class, i.getSubject().getId());
//the Subject entity is Many to One relation
model.addAttribute("subject", s);
这个可行,但我不知道为什么以前的方法不起作用
PS:这是一段伪代码,交易是在这个方法之外处理的,我只报告了一些代码来说明问题:)
如果你不想得到第一种方法的错误,你可以使用这样的东西:
Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();
Invoice i = (Invoice) miasession.get(Invoice.class, id);
// load the collection before session is closed
model.addAttribute("subject", Hibernate.initialize(i.getSubject()));
另一种解决惰性问题的方法是在 web.xml
中使用 OpenSessionInViewFilter