/* * 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 java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Locale; import javax.persistence.AttributeConverter; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.Session; import org.hibernate.jdbc.Work; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * @author Steve Ebersole */ public class NullHandlingTests extends BaseCoreFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { TheEntity.class }; } @Test @TestForIssue( jiraKey = "HHH-8697" ) public void testNullReplacementOnBinding() { TheEntity theEntity = new TheEntity( 1 ); Session session = openSession(); session.beginTransaction(); // at this point TheEntity.sex is null // lets make sure that the converter is given a chance to adjust that to UNKNOWN... session.save( theEntity ); session.getTransaction().commit(); session.close(); session = openSession(); session.beginTransaction(); session.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { ResultSet rs = connection.createStatement().executeQuery( "select sex from the_entity where id=1" ); try { if ( !rs.next() ) { throw new RuntimeException( "Could not locate inserted row" ); } String sexDbValue = rs.getString( 1 ); if ( rs.next() ) { throw new RuntimeException( "Found more than one row" ); } assertEquals( Sex.UNKNOWN.name().toLowerCase( Locale.ENGLISH ), sexDbValue ); } finally { rs.close(); } } } ); session.getTransaction().commit(); session.close(); session = openSession(); session.beginTransaction(); session.delete( theEntity ); session.getTransaction().commit(); session.close(); } @Test @TestForIssue( jiraKey = "HHH-9320" ) public void testNullReplacementOnExtraction() { Session session = openSession(); session.beginTransaction(); session.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { connection.createStatement().execute( "insert into the_entity(id, sex) values (1, null)" ); } } ); session.getTransaction().commit(); session.close(); session = openSession(); session.beginTransaction(); // at this point TheEntity.sex is null in the database // lets load it and make sure that the converter is given a chance to adjust that to UNKNOWN... TheEntity theEntity = (TheEntity) session.get( TheEntity.class, 1 ); session.getTransaction().commit(); session.close(); assertEquals( Sex.UNKNOWN, theEntity.sex ); session = openSession(); session.beginTransaction(); session.delete( theEntity ); session.getTransaction().commit(); session.close(); } @Entity( name = "TheEntity" ) @Table( name = "the_entity" ) public static class TheEntity { @Id public Integer id; @Convert( converter = SexConverter.class ) public Sex sex; public TheEntity() { } public TheEntity(Integer id) { this.id = id; } } public static enum Sex { MALE, FEMALE, UNKNOWN } public static class SexConverter implements AttributeConverter<Sex,String> { @Override public String convertToDatabaseColumn(Sex attribute) { // HHH-8697 if ( attribute == null ) { return Sex.UNKNOWN.name().toLowerCase( Locale.ENGLISH ); } return attribute.name().toLowerCase( Locale.ENGLISH ); } @Override public Sex convertToEntityAttribute(String dbData) { // HHH-9320 if ( dbData == null ) { return Sex.UNKNOWN; } return Sex.valueOf( dbData.toUpperCase( Locale.ENGLISH ) ); } } }