diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java index a0156aeb77..e83510282b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java @@ -259,6 +259,7 @@ public abstract class AbstractIdentifiableType public void applyVersionAttribute(SingularAttributeImpl versionAttribute) { AbstractIdentifiableType.this.version = versionAttribute; + managedBuilder.addAttribute( versionAttribute ); } public void addAttribute(Attribute attribute) { diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java index a40ba3befe..c903add213 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java @@ -178,6 +178,10 @@ class MetadataContext { // #buildIdClassAttributes continue; } + if ( safeMapping.isVersioned() && property == safeMapping.getVersion() ) { + // skip the version property, it was already handled previously. + continue; + } final Attribute attribute = attributeFactory.buildAttribute( jpa2Mapping, property ); if ( attribute != null ) { jpa2Mapping.getBuilder().addAttribute( attribute ); @@ -203,6 +207,10 @@ class MetadataContext { Iterator properties = safeMapping.getDeclaredPropertyIterator(); while ( properties.hasNext() ) { final Property property = properties.next(); + if ( safeMapping.isVersioned() && property == safeMapping.getVersion() ) { + // skip the version property, it was already handled previously. + continue; + } final Attribute attribute = attributeFactory.buildAttribute( jpa2Mapping, property ); if ( attribute != null ) { jpa2Mapping.getBuilder().addAttribute( attribute ); diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/AbstractMetamodelSpecificTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/AbstractMetamodelSpecificTest.java index 8d83efca56..74480328e4 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/AbstractMetamodelSpecificTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/AbstractMetamodelSpecificTest.java @@ -35,7 +35,7 @@ public abstract class AbstractMetamodelSpecificTest extends TestCase { return new Class[] { Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, Info.class, LineItem.class, Order.class, Phone.class, Product.class, - ShelfLife.class, Spouse.class + ShelfLife.class, Spouse.class, VersionedEntity.class }; } } diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/EmbeddedTypeTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/EmbeddedTypeTest.java index d5926234a7..cac1cb0c5f 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/EmbeddedTypeTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/EmbeddedTypeTest.java @@ -23,6 +23,7 @@ */ package org.hibernate.ejb.metamodel; import javax.persistence.EntityManager; +import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.SingularAttribute; import org.hibernate.ejb.test.TestCase; @@ -35,7 +36,7 @@ public class EmbeddedTypeTest extends TestCase { @Override public Class[] getAnnotatedClasses() { return new Class[] { - Product.class, ShelfLife.class + Product.class, ShelfLife.class, VersionedEntity.class }; } @@ -53,4 +54,16 @@ public class EmbeddedTypeTest extends TestCase { em.getTransaction().commit(); em.close(); } + + public void testVersionAttributeMetadata() { + // HHH-5821 + EntityManager em = getOrCreateEntityManager(); + EntityType metadata = em.getMetamodel().entity( VersionedEntity.class ); + assertNotNull( metadata.getDeclaredVersion( int.class ) ); + assertTrue( metadata.getDeclaredVersion( int.class ).isVersion() ); + assertEquals( 3, metadata.getDeclaredSingularAttributes().size() ); + assertTrue( metadata.getDeclaredSingularAttributes().contains( metadata.getDeclaredVersion( int.class ) ) ); + em.close(); + } + } diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/VersionedEntity.java b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/VersionedEntity.java new file mode 100644 index 0000000000..6873cd876d --- /dev/null +++ b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/metamodel/VersionedEntity.java @@ -0,0 +1,64 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.ejb.metamodel; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Version; + +/** + * @author Steve Ebersole + */ +@Entity +public class VersionedEntity { + private String id; + private String name; + private int version; + + @Id + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Version + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } +}