public void close() {
    // The spec says so, that's why :(
    validateNotClosed();

    sessionFactory.close();
    EntityManagerFactoryRegistry.INSTANCE.removeEntityManagerFactory(
        entityManagerFactoryName, this);
  }
  private static EntityManagerFactory getNamedEntityManagerFactory(String entityManagerFactoryName)
      throws InvalidObjectException {
    Object result =
        EntityManagerFactoryRegistry.INSTANCE.getNamedEntityManagerFactory(
            entityManagerFactoryName);

    if (result == null) {
      throw new InvalidObjectException(
          "could not resolve entity manager factory during entity manager deserialization [name="
              + entityManagerFactoryName
              + "]");
    }

    return (EntityManagerFactory) result;
  }
  public EntityManagerFactoryImpl(
      String persistenceUnitName,
      SessionFactoryImplementor sessionFactory,
      SettingsImpl settings,
      Map<?, ?> configurationValues,
      Configuration cfg) {
    this.sessionFactory = (SessionFactoryImpl) sessionFactory;
    this.transactionType = settings.getTransactionType();
    this.discardOnClose = settings.isReleaseResourcesOnCloseEnabled();
    this.sessionInterceptorClass = settings.getSessionInterceptorClass();

    final JpaMetaModelPopulationSetting jpaMetaModelPopulationSetting =
        determineJpaMetaModelPopulationSetting(cfg);
    if (JpaMetaModelPopulationSetting.DISABLED == jpaMetaModelPopulationSetting) {
      this.metamodel = null;
    } else {
      this.metamodel =
          MetamodelImpl.buildMetamodel(
              cfg.getClassMappings(),
              cfg.getMappedSuperclassMappingsCopy(),
              sessionFactory,
              JpaMetaModelPopulationSetting.IGNORE_UNSUPPORTED == jpaMetaModelPopulationSetting);
    }
    this.criteriaBuilder = new CriteriaBuilderImpl(this);
    this.util = new HibernatePersistenceUnitUtil(this);

    HashMap<String, Object> props = new HashMap<String, Object>();
    addAll(props, sessionFactory.getProperties());
    addAll(props, cfg.getProperties());
    addAll(props, configurationValues);
    maskOutSensitiveInformation(props);
    this.properties = Collections.unmodifiableMap(props);
    String entityManagerFactoryName =
        (String) this.properties.get(AvailableSettings.ENTITY_MANAGER_FACTORY_NAME);
    if (entityManagerFactoryName == null) {
      entityManagerFactoryName = persistenceUnitName;
    }
    if (entityManagerFactoryName == null) {
      entityManagerFactoryName = (String) UUID_GENERATOR.generate(null, null);
    }
    this.entityManagerFactoryName = entityManagerFactoryName;

    applyNamedEntityGraphs(cfg.getNamedEntityGraphs());

    EntityManagerFactoryRegistry.INSTANCE.addEntityManagerFactory(entityManagerFactoryName, this);
  }