在Hibernate中初始化代理的所有属性

时间:2014-11-26 20:00:04

标签: java spring hibernate

我使用Spring JpaRepository访问数据库。我的目标是创建一个方法,找到一个实体并完全初始化它。目前我这样做:

Hibernate.initialize(business.getCollectionA());
Hibernate.initialize(business.getCollectionB());
Hibernate.initialize(business.getCollectionC());

所以我搜索一个像这样一次初始化所有集合的方法:

Hibernate.initializeAll(business);

3 个答案:

答案 0 :(得分:1)

因此HibernateJPA未提供任何实用程序来初始化该实体的所有lazy properties

您需要编写recursive逻辑,使用Java Reflection遍历树并初始化对象。

您可以更多或更少地找到here

答案 1 :(得分:0)

您可以将集合属性标记为FetchType.EAGER,以便在加载实体后立即自动加载它们。

e.g。

@OneToMany(fetch=FetchType.EAGER)
private Set collectionA;

将此fetchtype添加到您想要“初始化”的任何集合中。请注意,这会导致性能下降,但它与在每个集合上调用initialize具有相同的效果。

答案 2 :(得分:0)

这个怎么样:

    import org.hibernate.SessionFactory;
    import org.hibernate.metadata.ClassMetadata;
    import org.hibernate.type.CollectionType;
    import org.hibernate.type.Type;

    // you should already have these somewhere:
    SessionFactory sessionFactory = ...
    Session session = ...
    MyEntity myEntity = ...

    // this fetches all collections by inspecting the Hibernate Metadata.
    ClassMetadata classMetadata = sessionFactory.getClassMetadata(MyEntity.class);
    String[] propertyNames = classMetadata.getPropertyNames();
    for (String name : propertyNames)
    {
        Object propertyValue = classMetadata.getPropertyValue(myEntity, name, EntityMode.POJO);
        Type propertyType = classMetadata.getPropertyType(name);
        if (propertyValue != null && propertyType instanceof CollectionType)
        {
            CollectionType s = (CollectionType) propertyType;
            s.getElementsIterator(propertyValue, session);   // this triggers the loading of the data
        }
    }