/** * Unproxies a {@link HibernateProxy}. If the proxy is uninitialized, it automatically triggers an initialization. * In case the supplied object is null or not a proxy, the object will be returned as-is. * * @param proxy the {@link HibernateProxy} to be unproxied * @param entityClass the entity type * @return the proxy's underlying implementation object, or the supplied object otherwise */ public static <T> T unproxy(T proxy, Class<T> entityClass) { return entityClass.cast( unproxy( proxy ) ); } }
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) public Child getChild() { return (Child) Hibernate.unproxy( child ); }
@Test public void testNotHibernateProxyShouldThrowException() { Parent p = new Parent(); Child c = new Child(); p.setChild( c ); doInJPA( this::entityManagerFactory, ( entityManager -> { entityManager.persist( p ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); assertSame( parent, Hibernate.unproxy( parent ) ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); assertSame( parent, Hibernate.unproxy( parent, Parent.class ) ); } ) ); }
@Test public void testInitializedProxyCanBeUnproxied() { Parent p = new Parent(); Child c = new Child(); p.setChild( c ); doInJPA( this::entityManagerFactory, ( entityManager -> { entityManager.persist( p ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); Child child = parent.getChild(); assertFalse( Hibernate.isInitialized( child ) ); Hibernate.initialize( child ); Child unproxiedChild = (Child) Hibernate.unproxy( child ); assertEquals( Child.class, unproxiedChild.getClass() ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); Child child = parent.getChild(); assertFalse( Hibernate.isInitialized( child ) ); Hibernate.initialize( child ); Child unproxiedChild = Hibernate.unproxy( child, Child.class ); assertEquals( Child.class, unproxiedChild.getClass() ); } ) ); }
@Test public void testNotInitializedProxyCanBeUnproxiedWithInitialization() { Parent p = new Parent(); Child c = new Child(); p.setChild( c ); doInJPA( this::entityManagerFactory, ( entityManager -> { entityManager.persist( p ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); Child child = parent.getChild(); assertFalse( Hibernate.isInitialized( child ) ); Child unproxiedChild = (Child) Hibernate.unproxy( child ); assertTrue( Hibernate.isInitialized( child ) ); assertEquals( Child.class, unproxiedChild.getClass() ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent parent = entityManager.find( Parent.class, p.getId() ); Child child = parent.getChild(); assertFalse( Hibernate.isInitialized( child ) ); Child unproxiedChild = Hibernate.unproxy( child, Child.class ); assertTrue( Hibernate.isInitialized( child ) ); assertEquals( Child.class, unproxiedChild.getClass() ); } ) ); }
@Test public void testProxyEquality() { Parent parent = doInJPA( this::entityManagerFactory, ( entityManager -> { Parent p = new Parent(); p.name = "John Doe"; entityManager.persist( p ); return p; } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent p = entityManager.getReference( Parent.class, parent.getId() ); assertFalse( parent.equals( p ) ); assertTrue( parent.equals( Hibernate.unproxy( p ) ) ); } ) ); doInJPA( this::entityManagerFactory, ( entityManager -> { Parent p = entityManager.getReference( Parent.class, parent.getId() ); assertFalse( parent.equals( p ) ); assertTrue( parent.equals( Hibernate.unproxy( p, Parent.class ) ) ); } ) ); }
/** * Unproxies a {@link HibernateProxy}. If the proxy is uninitialized, it automatically triggers an initialization. * In case the supplied object is null or not a proxy, the object will be returned as-is. * * @param proxy the {@link HibernateProxy} to be unproxied * @param entityClass the entity type * @return the proxy's underlying implementation object, or the supplied object otherwise */ public static <T> T unproxy(T proxy, Class<T> entityClass) { return entityClass.cast( unproxy( proxy ) ); } }
@Override public Item findItemByUid(String uid) { // Prevent auto flushing when looking up item by uid List<HibItem> results = this.em.createQuery("FROM HibItem h WHERE h.uid= :uid", HibItem.class) .setParameter("uid", uid).getResultList(); if (!results.isEmpty()) { return (HibItem) Hibernate.unproxy(results.get(0)); } return null; }
@Override public Item findItemByUid(String uid) { // Prevent auto flushing when looking up item by uid List<HibItem> results = this.em.createQuery("FROM HibItem h WHERE h.uid= :uid", HibItem.class) .setParameter("uid", uid).getResultList(); if (!results.isEmpty()) { return (HibItem) Hibernate.unproxy(results.get(0)); } return null; }
private void incrementRootVersion(FlushEntityEvent event, Object root) { EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry( Hibernate.unproxy( root) ); if(entityEntry.getStatus() != Status.DELETED) { event.getSession().lock(root, LockMode.OPTIMISTIC_FORCE_INCREMENT); } }
assertTrue(_post.equals( Hibernate.unproxy( post))); });