我的代码检索与用户有关的所有信息:
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用户的ES。
ud.getAddresses()
Address
我的问题是:ud即使会话已经关闭,为什么对象仍然具有其值(例如名称)?getAddresses()是UserDetails该类的实例变量。但是为什么我不能检索其值却可以检索UserDetails该类的常规实例变量?
ud
getAddresses()
UserDetails
ud.getAddresses()是一个@EmbeddedCollection。
@EmbeddedCollection
userAddress = ud.getAddresses(); session.getTransaction().commit(); for(Address addr: userAddress) {
有关使用惰性关联的hibernate文档清楚地将这种访问称为错误。只有在会话仍处于打开状态时,才能与延迟关联的对象进行交互。文档的该部分还提供了访问对象的延迟关联成员的替代方法,我们更喜欢在应用程序中使用的条件中将获取模式指定为JOIN。