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;
    }