我得到了好的,老旧的可怕的TransientObjectException,并且在这种情况下经常发生,我在找到什么样的微妙错误导致问题的时候遇到问题.
我的问题是:有没有办法获取当前Hibernate会话中的每个对象的列表?
当我得到这个问题的答案时,我可能已经解决了当前的问题,但无论如何,无论如何,能够列出会话的所有内容将在下一次发生的时候帮助很多.
解决方法
Hibernate并没有将其内部公开给公众,所以你不会在公共API中找到你要搜索的内容.但是,您可以在Hibernate接口的实现类中找到答案:
此方法(从 http://code.google.com/p/bo2/source/browse/trunk/Bo2ImplHibernate/main/gr/interamerican/bo2/impl/open/hibernate/HibernateBo2Utils.java获取)将告诉会话中是否存在对象:
此方法(从 http://code.google.com/p/bo2/source/browse/trunk/Bo2ImplHibernate/main/gr/interamerican/bo2/impl/open/hibernate/HibernateBo2Utils.java获取)将告诉会话中是否存在对象:
public static Object getFromSession (Serializable identifier,Class<?> clazz,Session s) { String entityName = clazz.getName(); if(identifier == null) { return null; } SessionImplementor sessionImpl = (SessionImplementor) s; EntityPersister entityPersister = sessionImpl.getFactory().getEntityPersister(entityName); PersistenceContext persistenceContext = sessionImpl.getPersistenceContext(); EntityKey entityKey = new EntityKey(identifier,entityPersister,EntityMode.POJO); Object entity = persistenceContext.getEntity(entityKey); return entity; }
如果你再深入一下,你会看到PersistenceContext的唯一实现是org.hibernate.engine.StatefulPersistenceContext.
这个类有以下集合:
// Loaded entity instances,by EntityKey private Map entitiesByKey; // Loaded entity instances,by EntityUniqueKey private Map entitiesByUniqueKey; // Identity map of EntityEntry instances,by the entity instance private Map entityEntries; // Entity proxies,by EntityKey private Map proxiesByKey; // Snapshots of current database state for entities // that have *not* been loaded private Map entitySnapshotsByKey; // Identity map of array holder ArrayHolder instances,by the array instance private Map arrayHolders; // Identity map of CollectionEntry instances,by the collection wrapper private Map collectionEntries; // Collection wrappers,by the CollectionKey private Map collectionsByKey; //key=CollectionKey,value=PersistentCollection // Set of EntityKeys of deleted objects private HashSet nullifiableEntityKeys; // properties that we have tried to load,and not found in the database private HashSet nullAssociations; // A list of collection wrappers that were instantiating during result set // processing,that we will need to initialize at the end of the query private List nonlazyCollections; // A container for collections we load up when the owning entity is not // yet loaded ... for now,this is purely transient! private Map unownedCollections; // Parent entities cache by their child for cascading // May be empty or not contains all relation private Map parentsByChild;
所以,你需要做的是将PersistenceContext转换为StatefulPersistenceContext,然后使用反射来获取所需的私有集合,然后对其进行迭代.
我强烈建议你只做调试代码.这不是公共API,它可能会被新的Hibernate版本制动.