public T createAndSave() {
      Session session = sessions.openSession();
      Transaction transaction = session.beginTransaction();

      Object cloud = null;

      if (polar) {
        PolarCloud polarCloud = new PolarCloud();
        polarCloud.setLength(length);

        for (String description : producedSnowflakes) {
          SnowFlake sf = new SnowFlake();
          sf.setDescription(description);
          session.save(sf);
          polarCloud.getProducedSnowFlakes().add(sf);
        }

        for (String description : backupSnowflakes) {
          SnowFlake sf = new SnowFlake();
          sf.setDescription(description);
          session.save(sf);
          polarCloud.getBackupSnowFlakes().add(sf);
        }
        cloud = polarCloud;
      } else {
        AnnotatedCloud annotatedCloud = new AnnotatedCloud();
        annotatedCloud.setLength(length);

        for (String description : producedSnowflakes) {
          SnowFlake sf = new SnowFlake();
          sf.setDescription(description);
          session.save(sf);
          annotatedCloud.getProducedSnowFlakes().add(sf);
        }

        for (String description : backupSnowflakes) {
          SnowFlake sf = new SnowFlake();
          sf.setDescription(description);
          session.save(sf);
          annotatedCloud.getBackupSnowFlakes().add(sf);
        }
        cloud = annotatedCloud;
      }

      session.persist(cloud);

      transaction.commit();
      session.close();

      @SuppressWarnings("unchecked")
      T result = (T) cloud;

      return result;
    }
  @After
  public void removeCloudAndSnowflakes() {
    Session session = sessions.openSession();
    Transaction transaction = session.beginTransaction();

    if (cloud != null) {
      AnnotatedCloud cloudToDelete =
          (AnnotatedCloud) session.get(AnnotatedCloud.class, cloud.getId());
      for (SnowFlake current : cloudToDelete.getProducedSnowFlakes()) {
        session.delete(current);
      }
      for (SnowFlake current : cloudToDelete.getBackupSnowFlakes()) {
        session.delete(current);
      }
      session.delete(cloudToDelete);
    }

    if (polarCloud != null) {
      PolarCloud cloudToDelete = (PolarCloud) session.get(PolarCloud.class, polarCloud.getId());
      for (SnowFlake current : cloudToDelete.getProducedSnowFlakes()) {
        session.delete(current);
      }
      for (SnowFlake current : cloudToDelete.getBackupSnowFlakes()) {
        session.delete(current);
      }
      session.delete(cloudToDelete);
    }

    transaction.commit();
    session.close();

    assertThat(TestHelper.getNumberOfEntities(sessions)).isEqualTo(0);
    assertThat(TestHelper.getNumberOfAssociations(sessions)).isEqualTo(0);

    sessions.close();
  }