/* * 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.envers.test.integration.customtype; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.Map; import org.hibernate.Session; import org.hibernate.cfg.Environment; import org.hibernate.dialect.H2Dialect; import org.hibernate.envers.test.BaseEnversFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.customtype.UnspecifiedEnumTypeEntity; import org.hibernate.jdbc.Work; import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.TestForIssue; import org.junit.Assert; import org.junit.Test; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ @TestForIssue(jiraKey = "HHH-7780") @RequiresDialect(value = H2Dialect.class) public class UnspecifiedEnumTypeTest extends BaseEnversFunctionalTestCase { private Long id = null; @Override protected String[] getMappings() { return new String[] {"mappings/customType/mappings.hbm.xml"}; } @Override protected void addSettings(Map settings) { super.addSettings( settings ); settings.put( Environment.HBM2DDL_AUTO, "" ); } @Test @Priority(10) public void prepareSchema() { Session session = openSession(); dropSchema( session ); createSchema( session ); session.close(); } @Test @Priority(1) public void dropSchema() { dropSchema( getSession() ); } public void dropSchema(Session session) { executeUpdateSafety( session, "drop table ENUM_ENTITY if exists" ); executeUpdateSafety( session, "drop table ENUM_ENTITY_AUD if exists" ); executeUpdateSafety( session, "drop table REVINFO if exists" ); executeUpdateSafety( session, "drop sequence REVISION_GENERATOR if exists" ); } private void createSchema(Session session) { executeUpdateSafety( session, "create table ENUM_ENTITY (ID bigint not null, enum1 integer, enum2 integer, primary key (ID))" ); executeUpdateSafety( session, "create table ENUM_ENTITY_AUD (ID bigint not null, REV integer not null, REVTYPE tinyint, enum1 integer, enum2 integer, primary key (ID, REV))" ); executeUpdateSafety( session, "create table REVINFO (REV integer not null, REVTSTMP bigint, primary key (REV))" ); executeUpdateSafety( session, "alter table ENUM_ENTITY_AUD add constraint FK_AUD_REV foreign key (REV) references REVINFO" ); executeUpdateSafety( session, "create sequence REVISION_GENERATOR start with 1 increment by 1" ); } private void executeUpdateSafety(Session session, String query) { session.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { connection.createStatement().execute( query ); } } ); } @Test @Priority(9) public void initData() { Session session = getSession(); // Revision 1 session.getTransaction().begin(); UnspecifiedEnumTypeEntity entity = new UnspecifiedEnumTypeEntity( UnspecifiedEnumTypeEntity.E1.X, UnspecifiedEnumTypeEntity.E2.A ); session.persist( entity ); session.getTransaction().commit(); id = entity.getId(); // Revision 2 session.getTransaction().begin(); entity = (UnspecifiedEnumTypeEntity) session.get( UnspecifiedEnumTypeEntity.class, entity.getId() ); entity.setEnum1( UnspecifiedEnumTypeEntity.E1.Y ); entity.setEnum2( UnspecifiedEnumTypeEntity.E2.B ); session.update( entity ); session.getTransaction().commit(); session.close(); } @Test @Priority(8) public void testRevisionCount() { Assert.assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( UnspecifiedEnumTypeEntity.class, id ) ); } @Test @Priority(7) public void testHistoryOfEnums() { UnspecifiedEnumTypeEntity ver1 = new UnspecifiedEnumTypeEntity( UnspecifiedEnumTypeEntity.E1.X, UnspecifiedEnumTypeEntity.E2.A, id ); UnspecifiedEnumTypeEntity ver2 = new UnspecifiedEnumTypeEntity( UnspecifiedEnumTypeEntity.E1.Y, UnspecifiedEnumTypeEntity.E2.B, id ); Assert.assertEquals( ver1, getAuditReader().find( UnspecifiedEnumTypeEntity.class, id, 1 ) ); Assert.assertEquals( ver2, getAuditReader().find( UnspecifiedEnumTypeEntity.class, id, 2 ) ); } @Test @Priority(6) public void testEnumRepresentation() { Session session = getSession(); List<Object[]> values = session.createSQLQuery( "SELECT enum1, enum2 FROM enum_entity_aud ORDER BY rev ASC" ) .list(); session.close(); Assert.assertNotNull( values ); Assert.assertEquals( 2, values.size() ); Assert.assertArrayEquals( new Object[] {0, 0}, values.get( 0 ) ); Assert.assertArrayEquals( new Object[] {1, 1}, values.get( 1 ) ); } }