/*
* 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.converter;
import javax.persistence.Convert;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.CompositeType;
import org.hibernate.type.StringType;
import org.hibernate.type.Type;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
/**
* Tests MappedSuperclass/Entity overriding of Convert definitions
*
* @author Steve Ebersole
*/
public class SimpleEmbeddableOverriddenConverterTest extends BaseNonConfigCoreFunctionalTestCase {
@Override
protected Class[] getAnnotatedClasses() {
return new Class[] { Person.class };
}
@Override
protected boolean createSchema() {
return false;
}
/**
* Test outcome of annotations exclusively.
*/
@Test
public void testSimpleConvertOverrides() {
final EntityPersister ep = sessionFactory().getEntityPersister( Person.class.getName() );
CompositeType homeAddressType = assertTyping( CompositeType.class, ep.getPropertyType( "homeAddress" ) );
Type homeAddressCityType = findCompositeAttributeType( homeAddressType, "city" );
assertTyping( StringType.class, homeAddressCityType );
}
public Type findCompositeAttributeType(CompositeType compositeType, String attributeName) {
int pos = 0;
for ( String name : compositeType.getPropertyNames() ) {
if ( name.equals( attributeName ) ) {
break;
}
pos++;
}
if ( pos >= compositeType.getPropertyNames().length ) {
throw new IllegalStateException( "Could not locate attribute index for [" + attributeName + "] in composite" );
}
return compositeType.getSubtypes()[pos];
}
@Embeddable
public static class Address {
public String street;
@Convert(converter = SillyStringConverter.class)
public String city;
}
@Entity( name="Person" )
public static class Person {
@Id
public Integer id;
@Embedded
@Convert( attributeName = "city", disableConversion = true )
public Address homeAddress;
}
}