/* * 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.id.usertype; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Comparator; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import org.junit.Test; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.hibernate.type.LongType; import org.hibernate.usertype.UserType; public class UserTypeComparableIdTest extends BaseCoreFunctionalTestCase { @Override protected void configure(Configuration configuration) { configuration.setProperty( AvailableSettings.ORDER_UPDATES, "true" ); } @Test @TestForIssue(jiraKey = "HHH-8999") public void testUserTypeId() { Session s = openSession(); s.beginTransaction(); SomeEntity e1 = new SomeEntity(); CustomId e1Id = new CustomId( 1L ); e1.setCustomId( e1Id ); SomeEntity e2 = new SomeEntity(); CustomId e2Id = new CustomId( 2L ); e2.setCustomId( e2Id ); s.persist( e1 ); s.persist( e2 ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); e1 = s.get( SomeEntity.class, e1Id ); e2 = s.get( SomeEntity.class, e2Id ); s.delete( e1 ); s.delete( e2 ); s.getTransaction().commit(); s.close(); } @Override public Class[] getAnnotatedClasses() { return new Class[] { SomeEntity.class }; } @TypeDef( name = "customId", typeClass = CustomIdType.class ) @Entity @Table(name = "some_entity") public static class SomeEntity { @Id @Type(type = "customId") @Column(name = "id") private CustomId customId; public CustomId getCustomId() { return customId; } public void setCustomId(final CustomId customId) { this.customId = customId; } } public static class CustomId implements Serializable, Comparable<CustomId> { private final Long value; public CustomId(final Long value) { this.value = value; } public Long getValue() { return value; } @Override public boolean equals(Object o) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } CustomId customId = (CustomId) o; return !( value != null ? !value.equals( customId.value ) : customId.value != null ); } @Override public int hashCode() { return value != null ? value.hashCode() : 0; } @Override public int compareTo(CustomId o) { return value.compareTo( o.value ); } } public static class CustomIdType implements UserType, Comparator<CustomId> { public static final LongType SQL_TYPE = LongType.INSTANCE; @Override public int[] sqlTypes() { return new int[] { SQL_TYPE.sqlType() }; } @Override public Object nullSafeGet( ResultSet resultSet, String[] names, SharedSessionContractImplementor sessionImplementor, Object o) throws HibernateException, SQLException { Long value = resultSet.getLong( names[0] ); return new CustomId( value ); } @Override public void nullSafeSet( PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor sessionImplementor) throws HibernateException, SQLException { CustomId customId = (CustomId) value; if ( customId == null ) { preparedStatement.setNull( index, SQL_TYPE.sqlType() ); } else { preparedStatement.setLong( index, customId.getValue() ); } } @Override public Class returnedClass() { return CustomId.class; } @Override public int compare(CustomId o1, CustomId o2) { return o1.getValue().compareTo( o2.getValue() ); } @Override public boolean equals(Object x, Object y) throws HibernateException { return x.equals( y ); } @Override public int hashCode(Object x) throws HibernateException { return x.hashCode(); } @Override public Object deepCopy(Object value) throws HibernateException { return value; } @Override public boolean isMutable() { return true; } @Override public Serializable disassemble(Object value) throws HibernateException { return (Serializable) value; } @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return cached; } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } } }