解决Websphere8.5.5上使用jpa2.1报错

解决Websphere8.5.5上使用jpa2.1报错

1.添加两个 jar包
hibernate-entitymanager-4.3.11.Final.jar //jpa2.1
portal-kernel-5.2.3.jar //用于在HibernatePersistenceProviderResolver类中判断当前容器是否为tomcat
2. 在SessionFactory配置中,给hibernate properties配置中添加以下配置(注意,这两个配置只能在webSphere用,如果跑在tomcat中需要把这两个配置注释掉,不然会报错)

```
<prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform</prop> 
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>

```
  1. 创建HibernatePersistenceProviderResolver类,并确保能被spring扫描到。

    package cn.com.agree.aweb.hibernate.dao.support;
    import org.hibernate.jpa.HibernatePersistenceProvider;
    import org.springframework.context.annotation.Configuration;
    
    import com.liferay.portal.kernel.util.ServerDetector;
    
    import javax.annotation.PostConstruct;
    import javax.persistence.spi.PersistenceProvider;
    import javax.persistence.spi.PersistenceProviderResolver;
    import javax.persistence.spi.PersistenceProviderResolverHolder;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * This allows to deploy upgraded JPA and Hibernate versions to Websphere 8.5.5.x servers.
     * Has been used successfully with JPA 2.1 and Hibernate 4.3.11
     *
     * Mostly a copy of <a href="https://hibernate.atlassian.net/browse/JPA-4">https://hibernate.atlassian.net/browse/JPA-4</a>
     * Changes made to deploy in a Spring environment.
     *
     * To use: add a @DependsOn("hibernatePersistenceProviderResolver") annotation on a DatabaseConfig class
     */
    @Configuration
    public class HibernatePersistenceProviderResolver implements PersistenceProviderResolver {
        private volatile PersistenceProvider persistenceProvider = new HibernatePersistenceProvider();
    
        @Override
        public List<PersistenceProvider> getPersistenceProviders() {
            return Collections.singletonList(persistenceProvider);
        }
    
        @Override
        public void clearCachedProviders() {
            persistenceProvider = new HibernatePersistenceProvider();
        }
    
        @PostConstruct
        public void register() {
        	if(ServerDetector.isTomcat()){
        		return;
        	}
            PersistenceProviderResolverHolder.setPersistenceProviderResolver(new HibernatePersistenceProviderResolver());
        }
    }
    
  2. 应用打成war,部署到webSphere上

  3. 修改类加载顺序为parent last
    解决Websphere8.5.5上使用jpa2.1报错
    解决Websphere8.5.5上使用jpa2.1报错