How to convert a Hibernate proxy to a real entity object

后端 未结 10 788
离开以前
离开以前 2020-11-22 16:49

During a Hibernate Session, I am loading some objects and some of them are loaded as proxies due to lazy loading. It\'s all OK and I don\'t want to turn lazy lo

10条回答
  •  遥遥无期
    2020-11-22 17:51

    With Spring Data JPA and Hibernate, I was using subinterfaces of JpaRepository to look up objects belonging to a type hierarchy that was mapped using the "join" strategy. Unfortunately, the queries were returning proxies of the base type instead of instances of the expected concrete types. This prevented me from casting the results to the correct types. Like you, I came here looking for an effective way to get my entites unproxied.

    Vlad has the right idea for unproxying these results; Yannis provides a little more detail. Adding to their answers, here's the rest of what you might be looking for:

    The following code provides an easy way to unproxy your proxied entities:

    import org.hibernate.engine.spi.PersistenceContext;
    import org.hibernate.engine.spi.SessionImplementor;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.jpa.repository.JpaContext;
    import org.springframework.stereotype.Component;
    
    @Component
    public final class JpaHibernateUtil {
    
        private static JpaContext jpaContext;
    
        @Autowired
        JpaHibernateUtil(JpaContext jpaContext) {
            JpaHibernateUtil.jpaContext = jpaContext;
        }
    
        public static  Type unproxy(Type proxied, Class type) {
            PersistenceContext persistenceContext =
                jpaContext
                .getEntityManagerByManagedType(type)
                .unwrap(SessionImplementor.class)
                .getPersistenceContext();
            Type unproxied = (Type) persistenceContext.unproxyAndReassociate(proxied);
            return unproxied;
        }
    
    }
    

    You can pass either unproxied entites or proxied entities to the unproxy method. If they are already unproxied, they'll simply be returned. Otherwise, they'll get unproxied and returned.

    Hope this helps!

提交回复
热议问题