Обязательно прочитайте и поймите абзац, предшествующий приведенному вами списку:
"Когда обрабатывается запрос на загрузку класса из загрузчика классов WebappX веб-приложения, этот загрузчик классов сначала просматривает локальные репозитории, а не делегирует их перед поиском. Существуют исключения. Классы, являющиеся частью базы JRE классы не могут быть переопределены. Для некоторых классов (таких как компоненты синтаксического анализатора XML в J2SE 1.4+) может использоваться одобренная функция J2SE 1.4. "
С какими этими "классами реализации hibernate" у вас возникают проблемы? (Классы реализации Hibernate будут полностью отличаться от классов Toplink.) Являются ли они классами javax.persistence? Они могут (или не могут) подпадают под категорию «Базовые классы JRE» , которые ведут себя по-разному.
Редактировать: Исходя из вашего комментария, это просто типичная проблема загрузки кросс-загрузчика. Загрузка классов Tomcat работает точно так, как вы ожидаете. Если вы посмотрите на классы JPA, где происходит эта инициализация, вы найдете строку, подобную этой:
Enumeration<URL> resources =
cl.getResources("META-INF/services/" + PersistenceProvider.class.getName());
Загружает все PersistenceProviders из все ClassLoaders, включая ваш Toplink в каталоге lib. Затем он немедленно делает это:
for ( PersistenceProvider provider : providers ) { ...
Это строка 77 javax.persistence.Persistence, откуда исходит ваше исключение. Это связано с тем, что класс PersistenceProvider, указанный в этой строке, взят из загрузчика классов webapp, но коллекция содержит два экземпляра: реализацию Hibernate из того же загрузчика классов и реализацию Toplink из другого загрузчика классов.
Эта глобальная статическая инициализация - одна из главных вещей, которая помешала мне перейти на JPA. Я до сих пор просто использую Hibernate из-за подобных проблем.