/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.proxy; import org.hibernate.Hibernate; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; import org.jboss.logging.Logger; import org.junit.Test; import javax.persistence.*; import java.util.Objects; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.Assert.*; public class HibernateUnproxyTest extends BaseEntityManagerFunctionalTestCase { private static final Logger log = Logger.getLogger( HibernateUnproxyTest.class ); @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[]{Parent.class, Child.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()); })); } @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()); })); } @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)); })); } @Test public void testNullUnproxyReturnsNull() { assertNull(Hibernate.unproxy(null)); } @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))); })); } @Entity(name = "Parent") public static class Parent { @Id @GeneratedValue private Integer id; private String name; @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Child child; public Integer getId() { return id; } public void setChild(Child child) { this.child = child; child.setParent(this); } public Child getChild() { return child; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Parent parent = (Parent) o; return Objects.equals(name, parent.name); } @Override public int hashCode() { return Objects.hash(name); } } @Entity(name = "Child") public static class Child { @Id @GeneratedValue private Integer id; @OneToOne(fetch = FetchType.LAZY) private Parent parent; public Integer getId() { return id; } public void setParent(Parent parent) { this.parent = parent; } public Parent getParent() { return parent; } } }