package org.hibernate.test.converter.inheritence; import java.util.List; import javax.persistence.AttributeConverter; import org.hibernate.cfg.AttributeConverterDefinition; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseUnitTestCase; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * Test the ability to interpret and understand AttributeConverter impls when the base class does not * explicitly implement AttributeConverter but implements it via an interface or superclass. This also * involves resolving any TypeVariables to Class or ParameterizedType. * * @author Svein Baardsen */ @TestForIssue(jiraKey = "HHH-8854") public class AttributeConverterOnSuperclassTest extends BaseUnitTestCase { public static class StringIntegerAttributeConverter implements AttributeConverter<String, Integer> { @Override public Integer convertToDatabaseColumn(String attribute) { return Integer.valueOf( attribute ); } @Override public String convertToEntityAttribute(Integer dbData) { return String.valueOf( dbData ); } } public static class StringIntegerConverterSubclass extends StringIntegerAttributeConverter { } @Test public void testAttributeConverterOnSuperclass() { AttributeConverterDefinition def = AttributeConverterDefinition.from( StringIntegerConverterSubclass.class ); assertEquals( String.class, def.getEntityAttributeType() ); } public interface StringLongAttributeConverter extends AttributeConverter<String, Long> { } public static class StringLongAttributeConverterImpl implements StringLongAttributeConverter { @Override public Long convertToDatabaseColumn(String attribute) { return Long.valueOf( attribute ); } @Override public String convertToEntityAttribute(Long dbData) { return String.valueOf( dbData ); } } @Test public void testAttributeConverterOnInterface() { AttributeConverterDefinition def = AttributeConverterDefinition.from( StringLongAttributeConverterImpl.class ); assertEquals( String.class, def.getEntityAttributeType() ); } public static class NoopAttributeConverter<T> implements AttributeConverter<T, T> { @Override public T convertToDatabaseColumn(T attribute) { return attribute; } @Override public T convertToEntityAttribute(T dbData) { return dbData; } } public static class StringNoopAttributeConverter extends NoopAttributeConverter<String> { } @Test public void testTypeVariableAttributeConverterTypeArguments() { AttributeConverterDefinition def = AttributeConverterDefinition.from( StringNoopAttributeConverter.class ); assertEquals( String.class, def.getEntityAttributeType() ); } public static class ListNoopAttributeConverter<T> extends NoopAttributeConverter<List<T>> { } public static class StringListNoopAttributeConverter extends ListNoopAttributeConverter<String> { } @Test public void testParameterizedTypeWithTypeVariableAttributeConverterTypeArguments() { AttributeConverterDefinition def = AttributeConverterDefinition.from( StringListNoopAttributeConverter.class ); assertEquals( List.class, def.getEntityAttributeType() ); } }