用于初始化惰性实体的标准JPA方法

Mr *_* T. 10 hibernate jpa initialization

我正在使用JPA(Hibernate作为我的JPA提供者).我真的试图避免使用hibernate细节并使用JPA规范.我有一个初始化惰性实体的函数.不幸的是,它使用了Hibernate特定的功能.这是我的功能:

private T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation();
        }
        return entity;
    }
Run Code Online (Sandbox Code Playgroud)

是否有任何纯JPA方式来初始化实体?

Arj*_*jms 7

似乎没有标准的方法来初始化实体.

有一种标准的方法来检查实体是否已初始化(完全加载),并且是通过PersistenceUnitUtil(另请参阅如何测试延迟加载的JPA集合是否已初始化?)

只要实体仍然附加,您就可以访问其属性以强制初始化.这不是很整洁,但在某种程度上确实有效.缺点是,根据属性的确切性质(例如,包含许多元素的集合),您可能会向数据库发送数十,数百甚至数千个查询.

在许多情况下,您最好先指定需要初始化的内容,而不是以编程方式强制初始化(未知)实体.我在这里写了一篇关于此的文章.

但是如果你真的需要通过一次调用一些标准框架方法来完全初始化实体,那么很遗憾似乎没有办法,你现在必须坚持使用Hibernate特定的代码.

  • 关于最后一句话:我从未使用它,但如何使用Entitygraphs获取完整实体(https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)?是不是可以获取实体的实体图并将其元模型的所有惰性属性作为AttributeNodes添加到它(然后获取它)? (2认同)