@Before
  public void setUp() throws Exception {
    Properties properties = new Properties();
    properties.setProperty(TableGenerator.TABLE, GEN_TABLE);
    properties.setProperty(TableGenerator.COLUMN, GEN_COLUMN);
    properties.setProperty(TableHiLoGenerator.MAX_LO, "3");
    properties.put(
        PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER,
        new ObjectNameNormalizer() {
          @Override
          protected boolean isUseQuotedIdentifiersGlobally() {
            return false;
          }

          @Override
          protected NamingStrategy getNamingStrategy() {
            return cfg.getNamingStrategy();
          }
        });

    Dialect dialect = new H2Dialect();

    generator = new TableHiLoGenerator();
    generator.configure(StandardBasicTypes.LONG, properties, dialect);

    cfg =
        TestingDatabaseInfo.buildBaseConfiguration()
            .setProperty(Environment.HBM2DDL_AUTO, "create-drop");
    cfg.addAuxiliaryDatabaseObject(
        new SimpleAuxiliaryDatabaseObject(
            generator.sqlCreateStrings(dialect)[0], generator.sqlDropStrings(dialect)[0]));

    cfg.addAuxiliaryDatabaseObject(
        new SimpleAuxiliaryDatabaseObject(generator.sqlCreateStrings(dialect)[1], null));

    serviceRegistry = ServiceRegistryBuilder.buildServiceRegistry(cfg.getProperties());
    sessionFactory = (SessionFactoryImplementor) cfg.buildSessionFactory(serviceRegistry);
  }
  @Test
  public void testHiLoAlgorithm() {
    SessionImpl session = (SessionImpl) sessionFactory.openSession();
    session.beginTransaction();

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // initially sequence should be uninitialized
    assertEquals(0L, extractInDatabaseValue(session));

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Long generatedValue = (Long) generator.generate(session, null);
    assertEquals(1L, generatedValue.longValue());
    assertEquals(1L, extractInDatabaseValue(session));

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    generatedValue = (Long) generator.generate(session, null);
    assertEquals(2L, generatedValue.longValue());
    assertEquals(1L, extractInDatabaseValue(session));

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    generatedValue = (Long) generator.generate(session, null);
    assertEquals(3L, generatedValue.longValue());
    assertEquals(1L, extractInDatabaseValue(session));

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    generatedValue = (Long) generator.generate(session, null);
    assertEquals(4L, generatedValue.longValue());
    assertEquals(2L, extractInDatabaseValue(session));

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    generatedValue = (Long) generator.generate(session, null);
    assertEquals(5L, generatedValue.longValue());
    assertEquals(2L, extractInDatabaseValue(session));

    session.getTransaction().commit();
    session.close();
  }