Java Spring Hibernate和@Transaction results LazyInitializationException

Java Spring Hibernate和@Transaction results LazyInitializationException,java,spring,hibernate,Java,Spring,Hibernate,考虑实体 public class User { ... @OneToMany(cascade = CascadeType.ALL) List<SocialCredential> credentialsList = new ArrayList<SocialCredential>(); } 和控制器 @Controller public class DummyController { @Autowired UserDAO userDAO; public vo

考虑实体

public class User {
...
@OneToMany(cascade = CascadeType.ALL)
List<SocialCredential> credentialsList = new ArrayList<SocialCredential>();
}
和控制器

@Controller
public class DummyController {
  @Autowired
  UserDAO userDAO;

  public void anyMethodAccessedByGetORPost(){
     User u= userDAO.getUser(1L);
  }

}

我的问题是,为什么实体用户的简单查询会自动触发查询来初始化SocialCredential的实体列表?@Transaction有什么问题吗?我不想急于加载list SocialCredential

您的错误是一个非常常见的休眠错误

List-credentialsList=new-ArrayList()

您需要获取该列表,您可以使用另一个查询来获取该特定列表,并设置为您的用户对象

Session s = sessionFactory.getCurrentSession();
list credentialsList = this.getCredentialsList();
User asu = (User) s.get(User.class, id);
asu.setCredentialsList(credentialsList);    
return asu;
有时工作的另一种方式是:

Session s = sessionFactory.getCurrentSession();
User asu = (User) s.get(User.class, id);
 **adding this line **
asu.getCredentialsList.get(0);
return asu;

您的错误是一个非常常见的休眠错误

List-credentialsList=new-ArrayList()

您需要获取该列表,您可以使用另一个查询来获取该特定列表,并设置为您的用户对象

Session s = sessionFactory.getCurrentSession();
list credentialsList = this.getCredentialsList();
User asu = (User) s.get(User.class, id);
asu.setCredentialsList(credentialsList);    
return asu;
有时工作的另一种方式是:

Session s = sessionFactory.getCurrentSession();
User asu = (User) s.get(User.class, id);
 **adding this line **
asu.getCredentialsList.get(0);
return asu;

我非常怀疑你的错误是来自交易方法。您的页面或控制器在尝试迭代集合时可能会出现错误(此时事务和会话已经结束)。我已经解决了问题。因为我使用的是Google App Engine,所以问题就出现在该端的某个地方。我高度怀疑您收到的错误是否来自事务方法。您可能会在页面或控制器尝试迭代集合时出错(此时事务和会话已经结束)。我已经解决了问题。因为我正在使用Google App Engine,问题就在这一端的某个地方。请在上重新发布该问题,感谢您的回答。更改列表凭据列表=新建ArrayList();列出证书清单;这不是我的问题。您描述的两种方法是加载完整对象(FetchType.EAGER已经这样做了)的黑客攻击,但这并不能解决加载代理/部分对象的问题。我已经解决了问题。因为我正在使用Google App Engine,问题就在这一端的某个地方。请在上重新发布该问题,感谢您的回答。更改列表凭据列表=新建ArrayList();列出证书清单;这不是我的问题。您描述的两种方法是加载完整对象(FetchType.EAGER已经这样做了)的黑客攻击,但这并不能解决加载代理/部分对象的问题。我已经解决了问题。因为我使用的是Google App Engine,问题就在这一端。请在