我的代码检索与用户有关的所有信息:

SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory();
Session session = sessionFactory.openSession();
UserDetails ud = null;
Set<Address> userAddress = null;

try {
    session.beginTransaction();
    ud = (UserDetails) session.get(UserDetails.class, 1);
    userAddress = ud.getAddresses();
    session.getTransaction().commit();
} catch (HibernateException e) {
    e.printStackTrace();
    session.getTransaction().rollback();
} finally {
    session.close();
}

System.out.println(ud.getName());

for(Address addr: userAddress){
    System.out.println("State " + addr.getState());
}
ud.getAddresses()仅返回用户的一组Address

我的问题是:即使 session 已经关闭,为什么ud对象仍然具有其值(例如名称)? getAddresses()UserDetails类的实例变量。但是,为什么我不能检索其值却可以检索UserDetails类的常规实例变量?
ud.getAddresses()@EmbeddedCollection

最佳答案

userAddress = ud.getAddresses();
session.getTransaction().commit();
for(Address addr: userAddress) {

working with lazy associations的 hibernate 文档显然将这种访问称为错误。只有在 session 仍处于打开状态时,才能与延迟关联的对象进行交互。该文档的那部分还提供了访问对象的延迟关联成员的替代方法,并且我们更喜欢在应用程序中使用的条件中将获取模式指定为JOIN。

07-28 00:48