如何知道子实体是否在休眠中的父实体中加载

How to know if the Child Entity is loaded or not in the Parent Entity in hibernate

我有一个休眠实体,其关系映射为 fetch=FetchType.LAZY

喜欢:

....
private ConsumerEntity consumerEntity;

@ManyToOne(fetchType.LAZY)
@JoinColumn(name="orderId", insertable=false, updateable=false)
public ConsumerEntity getConsumerEntity(){
    return this.consumerEntity;
}
....

我想将实体对象转移到 HashMap<String, Object>,我用 Introspector 来做,目前只忽略子实体,只将非实体成员解析到地图:

protected Map<String, Object> transBean2Map(Object beanObj){
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(beanObj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();

                if (!key.equals("class")
                       && !key.endsWith("Entity")) {
                    Method getter = property.getReadMethod();
                    Object value = getter.invoke(beanObj);
                    map.put(key, value);
                }
            }
        } catch (Exception e) {
            Logger.getAnonymousLogger().log(Level.SEVERE,"transBean2Map Error " + e);
        }
        return map;
    }

我想将地图中的每个子实体作为嵌入式地图放置,仅当它们已经被获取时(可能通过显式调用 getter()方法或不小心通过其他方法加载,在不打扰的时候提供奖励信息总是一个好主意,对吧?)。

而且不,我不想把每件事都变成 fetchType.EAGER。只是想检测子实体是否已经加载,然后将它们传输并嵌入到父 Map 中,否则什么也不做(不会查询数据库来获取它)。

做嵌入不会太麻烦,也许只是一些递归。所以我需要知道子实体是否已经加载到父实体中,就像上面示例中的 consumerEntity 一样。

有什么办法可以做到吗?

Hibernate 为此提供了一些工具,您可以尝试以下工具

if (HibernateProxy.class.isInstance(entity.getConsumerEntity())) {
    HibernateProxy proxy = HibernateProxy.class.cast(entity.getConsumerEntity());
    if (proxy.getHibernateLazyInitializer().isUninitialized()) {
        // getConsumerEntity() IS NOT initialized
    } else {
        // getConsumerEntity() IS initialized
    }
}