HHH-4859 fix NPE on true embedded ids (ie no property) when building the metamodel

git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@18661 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
Emmanuel Bernard 2010-01-28 00:00:50 +00:00
parent d586421cfb
commit 80156b4170
4 changed files with 63 additions and 2 deletions

View File

@ -37,6 +37,8 @@ import javax.persistence.metamodel.IdentifiableType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.KeyValue;
import org.hibernate.mapping.MappedSuperclass; import org.hibernate.mapping.MappedSuperclass;
import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property; import org.hibernate.mapping.Property;
@ -221,9 +223,26 @@ class MetadataContext {
); );
} }
} }
else { else if ( persistentClass.hasIdentifierMapper() ) {
jpaEntityType.getBuilder().applyIdClassAttributes( buildIdClassAttributes( jpaEntityType, persistentClass ) ); jpaEntityType.getBuilder().applyIdClassAttributes( buildIdClassAttributes( jpaEntityType, persistentClass ) );
} }
else {
final KeyValue value = persistentClass.getIdentifier();
if (value instanceof Component ) {
final Component component = ( Component ) value;
if ( component.getPropertySpan() > 1 ) {
//FIXME we are an Hibernate embedded id (ie not type)
}
else {
//FIXME take care of declared vs non declared property
jpaEntityType.getBuilder().applyIdAttribute(
attributeFactory.buildIdAttribute(
jpaEntityType,
(Property) component.getPropertyIterator().next() )
);
}
}
}
} }
private <X> void applyIdMetadata(MappedSuperclass mappingType, MappedSuperclassTypeImpl<X> jpaMappingType) { private <X> void applyIdMetadata(MappedSuperclass mappingType, MappedSuperclassTypeImpl<X> jpaMappingType) {

View File

@ -14,13 +14,17 @@ public class SecondMetadataTest extends TestCase {
assertNotNull( emf.getMetamodel() ); assertNotNull( emf.getMetamodel() );
assertNotNull( emf.getMetamodel().entity( DeskWithRawType.class ) ); assertNotNull( emf.getMetamodel().entity( DeskWithRawType.class ) );
assertNotNull( emf.getMetamodel().entity( EmployeeWithRawType.class ) ); assertNotNull( emf.getMetamodel().entity( EmployeeWithRawType.class ) );
assertNotNull( emf.getMetamodel().entity( SimpleMedicalHistory.class ) );
assertNotNull( emf.getMetamodel().entity( SimplePerson.class ) );
} }
@Override @Override
public Class[] getAnnotatedClasses() { public Class[] getAnnotatedClasses() {
return new Class[] { return new Class[] {
DeskWithRawType.class, DeskWithRawType.class,
EmployeeWithRawType.class EmployeeWithRawType.class,
SimpleMedicalHistory.class,
SimplePerson.class
}; };
} }
} }

View File

@ -0,0 +1,25 @@
package org.hibernate.ejb.test.metadata;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* @author Emmanuel Bernard
*/
@Entity
public class SimpleMedicalHistory implements Serializable {
@Temporal(TemporalType.DATE)
Date lastupdate;
@Id
@JoinColumn(name = "FK")
@OneToOne
SimplePerson patient;
}

View File

@ -0,0 +1,13 @@
package org.hibernate.ejb.test.metadata;
import javax.persistence.Entity;
import javax.persistence.Id;
/**
* @author Emmanuel Bernard
*/
@Entity
public class SimplePerson {
@Id
String ssn;
}