/*
* 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.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.junit.Test;
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.MySQLDialect;
import org.hibernate.dialect.SybaseDialect;
import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
/**
* Tests that persisted timestamp properties have the expected format to milliseconds
* and tests that entities can be queried by timestamp value.
*
* See Mysql57TimestampFspTest for tests using MySQL 5.7. MySQL 5.7 is tested separately
* because it requires CURRENT_TIMESTAMP(6) or NOW(6) as a default.
*
* @author Gail Badner
*/
@SkipForDialect( value={SybaseDialect.class, MySQLDialect.class}, comment="CURRENT_TIMESTAMP not supported as default value in Sybase or MySQL" )
public class TimestampPropertyTest 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 TimestampPropertyTest$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 TimestampPropertyTest$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 TimestampPropertyTest$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 TimestampPropertyTest$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();
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { Entity.class };
}
@javax.persistence.Entity
@Table(name = "MyEntity")
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" )
private Date tsColumnDefault;
}
}