微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Hibernate:如何获取当前在会话中的所有对象的列表

我得到了好的,老旧的可怕的TransientObjectException,并且在这种情况下经常发生,我在找到什么样的微妙错误导致问题的时候遇到问题.

我的问题是:有没有办法获取当前Hibernate会话中的每个对象的列表?

当我得到这个问题的答案时,我可能已经解决了当前的问题,但无论如何,无论如何,能够列出会话的所有内容将在下一次发生的时候帮助很多.

解决方法

Hibernate并没有将其内部公开给公众,所以你不会在公共API中找到你要搜索内容.但是,您可以在Hibernate接口的实现类中找到答案:
方法(从 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版本制动.

原文地址:https://www.jb51.cc/java/126936.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐