/* * 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.temporal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.Generated; import org.hibernate.annotations.GenerationTime; import org.hibernate.dialect.MySQL57Dialect; import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.junit.Test; import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.assertEquals; /** * @author Gail Badner */ @RequiresDialect(value = MySQL57Dialect.class) @TestForIssue( jiraKey = "HHH-8401") public class MySQL57TimestampPropertyTest extends BaseCoreFunctionalTestCase { private final DateFormat timestampFormat = new SimpleDateFormat("HH:mm:ss.SSS"); @Test public void testTime() { final Entity eOrig = new Entity(); eOrig.ts = new Date(); Session s = openSession(); s.getTransaction().begin(); s.persist( eOrig ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Entity eGotten = (Entity) s.get( Entity.class, eOrig.id ); final String tsOrigFormatted = timestampFormat.format( eOrig.ts ); final String tsGottenFormatted = timestampFormat.format( eGotten.ts ); assertEquals( tsOrigFormatted , tsGottenFormatted ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithParameter = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where ts=?" ).setParameter( 0, eOrig.ts ); final Entity eQueriedWithParameter = (Entity) queryWithParameter.uniqueResult(); assertNotNull( eQueriedWithParameter ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithTimestamp = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where ts=?" ).setTimestamp( 0, eOrig.ts ); final Entity eQueriedWithTimestamp = (Entity) queryWithTimestamp.uniqueResult(); assertNotNull( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); s.delete( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); } @Test public void testTimeGeneratedByColumnDefault() { final Entity eOrig = new Entity(); Session s = openSession(); s.getTransaction().begin(); s.persist( eOrig ); s.getTransaction().commit(); s.close(); assertNotNull( eOrig.tsColumnDefault ); s = openSession(); s.getTransaction().begin(); final Entity eGotten = (Entity) s.get( Entity.class, eOrig.id ); final String tsColumnDefaultOrigFormatted = timestampFormat.format( eOrig.tsColumnDefault ); final String tsColumnDefaultGottenFormatted = timestampFormat.format( eGotten.tsColumnDefault ); assertEquals( tsColumnDefaultOrigFormatted , tsColumnDefaultGottenFormatted ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithParameter = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where tsColumnDefault=?" ) .setParameter( 0, eOrig.tsColumnDefault ); final Entity eQueriedWithParameter = (Entity) queryWithParameter.uniqueResult(); assertNotNull( eQueriedWithParameter ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithTimestamp = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where tsColumnDefault=?" ) .setTimestamp( 0, eOrig.tsColumnDefault ); final Entity eQueriedWithTimestamp = (Entity) queryWithTimestamp.uniqueResult(); assertNotNull( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); s.delete( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); } @Test public void testTimeGeneratedByColumnDefinition() { final Entity eOrig = new Entity(); Session s = openSession(); s.getTransaction().begin(); s.persist( eOrig ); s.getTransaction().commit(); s.close(); assertNotNull( eOrig.tsColumnDefinition ); s = openSession(); s.getTransaction().begin(); final Entity eGotten = (Entity) s.get( Entity.class, eOrig.id ); final String tsColumnDefinitionOrigFormatted = timestampFormat.format( eOrig.tsColumnDefinition ); final String tsColumnDefinitionGottenFormatted = timestampFormat.format( eGotten.tsColumnDefinition ); assertEquals( tsColumnDefinitionOrigFormatted , tsColumnDefinitionGottenFormatted ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithParameter = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where tsColumnDefinition=?" ) .setParameter( 0, eOrig.tsColumnDefinition ); final Entity eQueriedWithParameter = (Entity) queryWithParameter.uniqueResult(); assertNotNull( eQueriedWithParameter ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); final Query queryWithTimestamp = s.createQuery( "from MySQL57TimestampPropertyTest$Entity where tsColumnDefinition=?" ) .setTimestamp( 0, eOrig.tsColumnDefinition ); final Entity eQueriedWithTimestamp = (Entity) queryWithTimestamp.uniqueResult(); assertNotNull( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); s = openSession(); s.getTransaction().begin(); s.delete( eQueriedWithTimestamp ); s.getTransaction().commit(); s.close(); } @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { Entity.class }; } @javax.persistence.Entity public static class Entity { @GeneratedValue @Id private long id; @Temporal( value = TemporalType.TIMESTAMP) private Date ts; @Temporal( value = TemporalType.TIMESTAMP ) @Generated( value = GenerationTime.INSERT ) @ColumnDefault( value = "CURRENT_TIMESTAMP(6)" ) private Date tsColumnDefault; @Temporal( value = TemporalType.TIMESTAMP ) @Generated( value = GenerationTime.INSERT ) @Column( columnDefinition = "datetime(6) default NOW(6)" ) private Date tsColumnDefinition; } }