@Override
  protected Foo removeImpl(Foo foo) {
    foo = toUnwrappedModel(foo);

    Session session = null;

    try {
      session = openSession();

      if (!session.contains(foo)) {
        foo = (Foo) session.get(FooImpl.class, foo.getPrimaryKeyObj());
      }

      if (foo != null) {
        session.delete(foo);
      }
    } catch (Exception e) {
      throw processException(e);
    } finally {
      closeSession(session);
    }

    if (foo != null) {
      clearCache(foo);
    }

    return foo;
  }
  @Override
  public Map<Serializable, Foo> fetchByPrimaryKeys(Set<Serializable> primaryKeys) {
    if (primaryKeys.isEmpty()) {
      return Collections.emptyMap();
    }

    Map<Serializable, Foo> map = new HashMap<Serializable, Foo>();

    if (primaryKeys.size() == 1) {
      Iterator<Serializable> iterator = primaryKeys.iterator();

      Serializable primaryKey = iterator.next();

      Foo foo = fetchByPrimaryKey(primaryKey);

      if (foo != null) {
        map.put(primaryKey, foo);
      }

      return map;
    }

    Set<Serializable> uncachedPrimaryKeys = null;

    for (Serializable primaryKey : primaryKeys) {
      Foo foo =
          (Foo)
              EntityCacheUtil.getResult(
                  FooModelImpl.ENTITY_CACHE_ENABLED, FooImpl.class, primaryKey);

      if (foo == null) {
        if (uncachedPrimaryKeys == null) {
          uncachedPrimaryKeys = new HashSet<Serializable>();
        }

        uncachedPrimaryKeys.add(primaryKey);
      } else {
        map.put(primaryKey, foo);
      }
    }

    if (uncachedPrimaryKeys == null) {
      return map;
    }

    StringBundler query = new StringBundler((uncachedPrimaryKeys.size() * 2) + 1);

    query.append(_SQL_SELECT_FOO_WHERE_PKS_IN);

    for (Serializable primaryKey : uncachedPrimaryKeys) {
      query.append(String.valueOf(primaryKey));

      query.append(StringPool.COMMA);
    }

    query.setIndex(query.index() - 1);

    query.append(StringPool.CLOSE_PARENTHESIS);

    String sql = query.toString();

    Session session = null;

    try {
      session = openSession();

      Query q = session.createQuery(sql);

      for (Foo foo : (List<Foo>) q.list()) {
        map.put(foo.getPrimaryKeyObj(), foo);

        cacheResult(foo);

        uncachedPrimaryKeys.remove(foo.getPrimaryKeyObj());
      }

      for (Serializable primaryKey : uncachedPrimaryKeys) {
        EntityCacheUtil.putResult(
            FooModelImpl.ENTITY_CACHE_ENABLED, FooImpl.class, primaryKey, _nullFoo);
      }
    } catch (Exception e) {
      throw processException(e);
    } finally {
      closeSession(session);
    }

    return map;
  }