HHH-7142 : Add test case for many-to-one on property-ref

This commit is contained in:
Gail Badner 2012-03-14 18:01:51 -07:00
parent fa2de2351a
commit 0b3baf5812
6 changed files with 74 additions and 22 deletions

View File

@ -126,18 +126,56 @@ public void testEntityWithManyToOneMapping() {
EntityBinding referencedEntityBinding = referenceBinding.getReferencedEntityBinding();
assertSame( "Should be the same entity binding", referencedEntityBinding, simpleEntityBinding );
EntityBinding entityWithManyToOneBinding = metadata.getEntityBinding( ManyToOneEntity.class.getName() );
// binding model
EntityBinding entityWithManyToOneBinding = metadata.getEntityBinding( EntityWithManyToOnes.class.getName() );
AttributeBinding attributeBinding = entityWithManyToOneBinding.locateAttributeBinding( "simpleEntity" );
assertSame( referenceBinding, attributeBinding );
checkManyToOneAttributeBinding(
metadata,
entityWithManyToOneBinding,
attributeBinding,
simpleEntityBinding.getHierarchyDetails().getEntityIdentifier().getValueBinding(),
"`simpleEntity`"
);
checkManyToOneAttributeBinding(
metadata,
entityWithManyToOneBinding,
entityWithManyToOneBinding.locateAttributeBinding( "simpleEntityFromPropertyRef" ),
simpleEntityBinding.locateAttributeBinding( "name" ),
"`simplename`"
);
}
private void checkManyToOneAttributeBinding(
MetadataImplementor metadata,
EntityBinding entityWithManyToOneBinding,
AttributeBinding attributeBinding,
AttributeBinding referencedAttributeBinding,
String manyToOneColumnName) {
final EntityBinding referencedEntityBinding = referencedAttributeBinding.getContainer().seekEntityBinding();
final String referencedEntityName = referencedEntityBinding.getEntity().getName();
assertTrue( SingularAttributeBinding.class.isInstance( referencedAttributeBinding ) );
assertEquals( 1, SingularAttributeBinding.class.cast( referencedAttributeBinding ).getRelationalValueBindings().size() );
final Value referencedValue =
SingularAttributeBinding.class.cast( referencedAttributeBinding )
.getRelationalValueBindings()
.iterator()
.next()
.getValue();
assertTrue( Column.class.isInstance( referencedValue ) );
final JdbcDataType referencedJdbcDataType = Column.class.cast( referencedValue ).getJdbcDataType();
// binding model
assertTrue( attributeBinding.isAssociation() );
assertTrue( attributeBinding.getEntityReferencingAttributeBindings().isEmpty() );
assertTrue( ManyToOneAttributeBinding.class.isInstance( attributeBinding ) );
ManyToOneAttributeBinding manyToOneAttributeBinding = (ManyToOneAttributeBinding) attributeBinding;
assertEquals( simpleEntityClassName, manyToOneAttributeBinding.getReferencedEntityName() );
assertSame( simpleEntityBinding, manyToOneAttributeBinding.getReferencedEntityBinding() );
assertFalse( manyToOneAttributeBinding.isPropertyReference() );
assertEquals( referencedEntityName, manyToOneAttributeBinding.getReferencedEntityName() );
assertSame( referencedEntityBinding, manyToOneAttributeBinding.getReferencedEntityBinding() );
assertEquals(
referencedAttributeBinding != referencedEntityBinding.getHierarchyDetails().getEntityIdentifier().getValueBinding(),
manyToOneAttributeBinding.isPropertyReference()
);
assertSame( CascadeStyle.NONE, manyToOneAttributeBinding.getCascadeStyle() );
assertTrue( manyToOneAttributeBinding.isLazy() );
assertSame( FetchMode.SELECT, manyToOneAttributeBinding.getFetchMode() );
@ -148,7 +186,7 @@ public void testEntityWithManyToOneMapping() {
assertFalse( manyToOneAttributeBinding.isAlternateUniqueKey() );
HibernateTypeDescriptor hibernateTypeDescriptor = manyToOneAttributeBinding.getHibernateTypeDescriptor();
Assert.assertNull( hibernateTypeDescriptor.getExplicitTypeName() );
Assert.assertEquals( simpleEntityClassName, hibernateTypeDescriptor.getJavaTypeName() );
Assert.assertEquals( referencedEntityName, hibernateTypeDescriptor.getJavaTypeName() );
assertTrue( hibernateTypeDescriptor.isToOne() );
assertTrue( hibernateTypeDescriptor.getTypeParameters().isEmpty() );
@ -160,12 +198,12 @@ public void testEntityWithManyToOneMapping() {
SingularAttribute simpleEntitySingularAttribute = ( SingularAttribute ) simpleEntityAttribute;
assertTrue( simpleEntitySingularAttribute.isTypeResolved() );
assertSame(
metadata.getEntityBinding( simpleEntityClassName ).getEntity(),
metadata.getEntityBinding( referencedEntityName ).getEntity(),
simpleEntitySingularAttribute.getSingularAttributeType()
);
Entity simpleEntityAttributeType = (Entity) simpleEntitySingularAttribute.getSingularAttributeType();
assertEquals( simpleEntityClassName, simpleEntityAttributeType.getName() );
Assert.assertEquals( simpleEntityClassName, simpleEntityAttributeType.getClassName());
assertEquals( referencedEntityName, simpleEntityAttributeType.getName() );
Assert.assertEquals( referencedEntityName, simpleEntityAttributeType.getClassName());
Assert.assertTrue( simpleEntityAttributeType.isAssociation() );
assertFalse( simpleEntityAttributeType.isComponent() );
@ -179,12 +217,12 @@ public void testEntityWithManyToOneMapping() {
assertTrue( relationalValueBinding.isNullable() );
assertTrue( relationalValueBinding.getValue() instanceof Column );
Column column = ( Column ) relationalValueBinding.getValue();
Assert.assertEquals( Identifier.toIdentifier( "`simpleEntity`" ), column.getColumnName() );
Assert.assertEquals( Identifier.toIdentifier( manyToOneColumnName ), column.getColumnName() );
assertFalse( column.isUnique() );
JdbcDataType jdbcDataType = column.getJdbcDataType();
Assert.assertEquals( Types.BIGINT, jdbcDataType.getTypeCode() );
assertSame( Long.class, jdbcDataType.getJavaType() );
assertEquals( "long", jdbcDataType.getTypeName() );
assertEquals( referencedJdbcDataType.getTypeCode(), jdbcDataType.getTypeCode() );
assertEquals( referencedJdbcDataType.getJavaType(), jdbcDataType.getJavaType() );
assertEquals( referencedJdbcDataType.getTypeName(), jdbcDataType.getTypeName() );
}
@Test

View File

@ -53,7 +53,7 @@ public void addSourcesForSimpleVersionedEntityBinding(MetadataSources sources) {
@Override
public void addSourcesForManyToOne(MetadataSources sources) {
sources.addAnnotatedClass( ManyToOneEntity.class );
sources.addAnnotatedClass( EntityWithManyToOnes.class );
}
@Override

View File

@ -42,7 +42,7 @@ public void addSourcesForSimpleVersionedEntityBinding(MetadataSources sources) {
}
public void addSourcesForManyToOne(MetadataSources sources) {
sources.addResource( "org/hibernate/metamodel/spi/binding/ManyToOneEntity.hbm.xml" );
sources.addResource( "org/hibernate/metamodel/spi/binding/EntityWithManyToOnes.hbm.xml" );
}
public void addSourcesForComponentBinding(MetadataSources sources) {

View File

@ -4,12 +4,13 @@
xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-mapping hibernate-mapping-4.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<class name="ManyToOneEntity">
<class name="EntityWithManyToOnes">
<id name="id">
<generator class="increment"/>
</id>
<property name="name"/>
<many-to-one name="simpleEntity"/>
<many-to-one name="simpleEntityFromPropertyRef" column="simplename" property-ref="name"/>
</class>
</hibernate-mapping>

View File

@ -25,23 +25,27 @@
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
/**
* @author Gail Badner
*/
@Entity
public class ManyToOneEntity {
public class EntityWithManyToOnes {
@Id
private Long id;
private String theName;
@ManyToOne
SimpleEntity simpleEntity;
@ManyToOne
@JoinColumn( name = "simplename", referencedColumnName = "name" )
SimpleEntity simpleEntityFromPropertyRef;
public ManyToOneEntity() {
public EntityWithManyToOnes() {
}
public ManyToOneEntity(String name) {
public EntityWithManyToOnes(String name) {
this.theName = name;
}
@ -69,13 +73,22 @@ public void setSimpleEntity(SimpleEntity simpleEntity) {
this.simpleEntity = simpleEntity;
}
public SimpleEntity getSimpleEntityFromPropertyRef() {
return simpleEntityFromPropertyRef;
}
public void setSimpleEntityFromPropertyRef(SimpleEntity simpleEntityFromPropertyRef) {
this.simpleEntityFromPropertyRef = simpleEntityFromPropertyRef;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "EntityWithManyToOne" );
sb.append( "EntityWithManyToOnes" );
sb.append( "{id=" ).append( id );
sb.append( ", theName='" ).append( theName ).append( '\'' );
sb.append( ", simpleEntity=" ).append( simpleEntity );
sb.append( ", simpleEntityFromPropertyRef=" ).append( simpleEntityFromPropertyRef );
sb.append( '}' );
return sb.toString();
}

View File

@ -8,7 +8,7 @@
<id name="id">
<generator class="increment"/>
</id>
<property name="name"/>
<property name="name" unique="true"/>
</class>
</hibernate-mapping>