From b11c23fd452134a83062ca120d1ff48dc083c94d Mon Sep 17 00:00:00 2001 From: Lukasz Antoniak Date: Mon, 24 Dec 2012 14:53:09 +0100 Subject: [PATCH] HHH-7561 - Fix and test --- .../tuple/entity/AbstractEntityTuplizer.java | 3 ++ .../org/hibernate/jpa/test/util/Article.java | 44 +++++++++++++++++++ .../jpa/test/util/GetIdentifierTest.java | 36 ++++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/Article.java diff --git a/hibernate-core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java b/hibernate-core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java index c738b966a8..4ad31ed08f 100644 --- a/hibernate-core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java +++ b/hibernate-core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java @@ -328,6 +328,9 @@ public Serializable getIdentifier(Object entity, SessionImplementor session) { if ( entityMetamodel.getIdentifierProperty().isEmbedded() ) { id = entity; } + else if ( HibernateProxy.class.isInstance( entity ) ) { + id = ( (HibernateProxy) entity ).getHibernateLazyInitializer().getIdentifier(); + } else { if ( idGetter == null ) { if (identifierMapperType==null) { diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/Article.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/Article.java new file mode 100644 index 0000000000..19d28da6da --- /dev/null +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/Article.java @@ -0,0 +1,44 @@ +package org.hibernate.jpa.test.util; + +import java.io.Serializable; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +/** + * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) + */ +@Entity +public class Article implements Serializable { + @Id + @GeneratedValue + private Integer id; + + @ManyToOne(fetch = FetchType.LAZY) + private Author author; + + public Article() { + } + + public Article(Author author) { + this.author = author; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } +} diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/GetIdentifierTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/GetIdentifierTest.java index dd52e838b6..b86979fbc3 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/GetIdentifierTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/util/GetIdentifierTest.java @@ -28,8 +28,11 @@ import org.junit.Test; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.testing.TestForIssue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @author Emmanuel Bernard @@ -47,6 +50,36 @@ public void testSimpleId() { em.close(); } + @Test + @TestForIssue(jiraKey = "HHH-7561") + public void testProxyObject() { + EntityManager em = entityManagerFactory().createEntityManager(); + em.getTransaction().begin(); + Book book = new Book(); + em.persist( book ); + em.flush(); + em.clear(); // Clear persistence context to receive proxy object below. + Book proxy = em.getReference( Book.class, book.getId() ); + assertTrue( proxy instanceof HibernateProxy ); + assertEquals( book.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( proxy ) ); + em.getTransaction().rollback(); + em.close(); + + em = entityManagerFactory().createEntityManager(); + em.getTransaction().begin(); + Author author = new Author(); + Article article = new Article( author ); + em.persist( author ); + em.persist( article ); + em.flush(); + em.clear(); // Clear persistence context to receive proxy relation below. + article = em.find( Article.class, article.getId() ); + assertTrue( article.getAuthor() instanceof HibernateProxy ); + assertEquals( author.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( article.getAuthor() ) ); + em.getTransaction().rollback(); + em.close(); + } + @Test public void testEmbeddedId() { EntityManager em = entityManagerFactory().createEntityManager(); @@ -86,7 +119,8 @@ public Class[] getAnnotatedClasses() { Book.class, Umbrella.class, Sickness.class, - Author.class + Author.class, + Article.class }; } }