A logo showing the text blog.marcnuri.com
English
Inicio»Java»Spring Data JPA + EclipseLink: Configurando Spring-Boot para usar EclipseLink como proveedor de JPA

Entradas Recientes

  • Fabric8 Kubernetes Client 7.2.0 está disponible!
  • Conectarse a un servidor MCP con JavaScript y AI SDK
  • Conectarse a un servidor MCP con JavaScript y LangChain.js
  • El Futuro de las Herramientas para Desarrolladores en la era de la IA
  • Conectarse a un servidor Model Context Protocol (MCP) con Java y LangChain4j

Categorías

  • Antiguo
  • Front-end
  • Go
  • Herramientas
  • Industria y negocios
  • Inteligencia Artificial
  • Java
  • JavaScript
  • Operaciones
  • Personal
  • Proyectos personales

Archivos

  • mayo 2025
  • abril 2025
  • marzo 2025
  • febrero 2025
  • enero 2025
  • diciembre 2024
  • noviembre 2024
  • agosto 2024
  • junio 2024
  • mayo 2024
  • abril 2024
  • marzo 2024
  • febrero 2024
  • enero 2024
  • diciembre 2023
  • noviembre 2023
  • octubre 2023
  • septiembre 2023
  • agosto 2023
  • julio 2023
  • junio 2023
  • mayo 2023
  • abril 2023
  • marzo 2023
  • febrero 2023
  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • junio 2020
  • mayo 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • enero 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • diciembre 2014
  • marzo 2014
  • febrero 2011
  • junio 2008
  • mayo 2008
  • abril 2008
  • enero 2008
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007

Spring Data JPA + EclipseLink: Configurando Spring-Boot para usar EclipseLink como proveedor de JPA

2015-12-27 en Java etiquetado Apache Tomcat / Eclipse / EclipseLink / Hibernate / JDBC / JPA / Spring Boot / Spring Data / Spring Framework / Tomcat por Marc Nuri | Última actualización: 2023-11-01
English version

Introducción

Spring + EclipseLink JPA
Spring + EclipseLink JPA

Spring emplea Hibernate como proveedor de JPA por defecto. Aunque Hibernate es una buena elección, algunos preferimos emplear EclipseLink debido a que en un principio se suponía que era la implementación de referencia para el JSR de Persistencia en Java.

En este artículo, mostraré como configurar una aplicación Spring Boot para usar EclipseLink con una base de datos H2 en memoria. No obstante, puedes emplear la misma técnica con cualquier otra base de datos.

El código fuente completo de este artículo puede encontrarse en GitHub.

Arreglando dependencias

Para poder emplear EclipseLink, es recomendable quitar el EntityManager de Hibernate del classpath para evitarnos colisiones. Para ello simplemente tenemos que añadir una exclusión en nuestro script de Gradle o en el fichero pom.xml de Maven. Si estamos empleando alguna otra herramienta de compilación, no será necesario este paso (o será distinto).

dependencies {
  implementation ('org.eclipse.persistence:eclipselink:2.7.7')
  implementation ('org.springframework.boot:spring-boot-starter-web')
  implementation('org.springframework.boot:spring-boot-starter-actuator')
  implementation('org.springframework.boot:spring-boot-starter-data-jpa'){
    exclude group: 'org.hibernate', module: 'hibernate-core'
    exclude group: 'org.hibernate.common', module: 'common-annotations'
  }
    //...Your project dependencies...
}

En el fragmento de código anterior, estamos añadiendo la exclusión al script build.gradle de nuestro proyecto de ejemplo.

Configurando Spring

Para poder cambiar el JPA vendor, vamos a extender JpaBaseConfiguration y anotarlo como una clase @Configuration (CustomJpaConfiguration).

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.marcnuri.demo.springeclipselink.repository")
public class CustomJpaConfiguration extends JpaBaseConfiguration {

  protected CustomJpaConfiguration(DataSource dataSource, JpaProperties properties,
    ObjectProvider<JtaTransactionManager> jtaTransactionManager) {
    super(dataSource, properties, jtaTransactionManager);
  }

  @Override
  protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
    return new EclipseLinkJpaVendorAdapter();
  }

  @Override
  protected Map<String, Object> getVendorProperties() {
    final Map<String, Object> ret = new HashMap<>();
    ret.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.JDBC);
    return ret;
  }

  @Bean("entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactory(
    EntityManagerFactoryBuilder builder, DataSource dataSource) {

    return builder
      .dataSource(dataSource)
      .packages("com.marcnuri.demo.springeclipselink.repository")
      .persistenceUnit("YourPersistenceUnitName")
      .properties(initJpaProperties()).build();
  }

  @Bean
  public static DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.h2.Driver");
    dataSource.setUrl("jdbc:h2:mem:marcnuridemo;DB_CLOSE_DELAY=-1");
    dataSource.setUsername("sa");
    dataSource.setPassword("password");
    return dataSource;
  }

  @Bean
  public static PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
  }

  @Bean
  @Primary
  public static JpaProperties properties() {
    final JpaProperties jpaProperties = new JpaProperties();
    jpaProperties.setShowSql(true);
    jpaProperties.setDatabasePlatform("org.eclipse.persistence.platform.database.H2Platform");
    return jpaProperties;
  }

  private static Map<String, ?> initJpaProperties() {
    final Map<String, Object> ret = new HashMap<>();
    // Add any JpaProperty you are interested in and is supported by your Database and JPA implementation
    ret.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.JDBC);
    ret.put(PersistenceUnitProperties.LOGGING_LEVEL, SessionLog.FINEST_LABEL);
    ret.put(PersistenceUnitProperties.WEAVING, "false");
    ret.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_ONLY);
    ret.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
    return ret;
  }
}

Al extender JpaBaseConfiguration, debemos de implementar los métodos createJpaVendorAdapter() y getVendorProperties(). El primero debe de devolver una implementación de AbstractJpaVendorAdapter, en este caso es realmente sencillo porque Spring ya dispone de un adaptador preconfigurado para EclipseLink (EclipseLinkJpaVendorAdapter). El segundo método, getVendorProperties(), debe devolver un Map con las propiedades JPA para la implementación JPA que elijamos. Podemos devolver un Map vacío si no queremos customizar nada.

Para completar la configuración vamos a configurar varios Beans que Spring empleará cuando sea necesario.

El primer Bean, entityManagerFactory, se usa para construir un EntityManagerFactory empleando el constructor facilitado y especificando nuestros parámetros. En este caso, le estamos facilitando el nombre de nuestro PersistenceUnit, el dataSource y el nombre de los paquetes donde se encuentran las Entidades y alguna propiedad JPA más.

También definimos un Bean como transactionManager. En este caso empleamos el gestor de transacciones facilitado por Spring, JpaTransactionManager.

Por último, definimos un DataSource para nuestro proveedor de persistencia. En este caso empleamos el simple DriverManagerDataSource. Sin embargo, en un entorno de producción es recomendable usar un datasource que pueda ofrecer un pool de conexiones. Todos estos parámetros serán usados con prioridad respecto a los que se hayan podido definir en el fichero de propiedades de la aplicación.

Connection Pooling / Pool de conexiones a la base de datos

Si estamos empleando Spring-Boot con el servidor Apache Tomcat embebido, podemos usar el DataSource que emplea Tomcat en su contendedor, que dispone de capacidad para hacer un pool de conexiones a la base de datos.

@Bean
public DataSource dataSource() {
  //In classpath from spring-boot-starter-web
  final Properties pool = new Properties();
  pool.put("driverClassName", "org.postgresql.Driver");
  pool.put("url", "jdbc:postgresql://example.com:5432/DatabaseName");
  pool.put("username", "user");
  pool.put("password", "password");
  pool.put("minIdle", 1);
  return new org.apache.tomcat.jdbc.pool.DataSourceFactory().createDataSource(pool);
}

En este caso, en lugar de devolver DriverManagerDataSource, vamos a usar el DataSourceFactory de Tomcat para generar un DataSource con los parámetros especificados. En esta página puedes encontrar un listado con todos los parámetros aceptados para poner a punto correctamente las conexiones a la base de datos.

Finalmente, cuando ejecutemos nuestra aplicación, Spring-Boot cogerá nuestra configuración y creará un EntityManagerFactory usando EclipseLink en lugar de Hibernate.

El código fuente completo de este artículo puede encontrarse en GitHub

Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Navegador de artículos
AngularJS: Cómo compartir datos entre controladores (Controllers) empleando servicios (Services)Docker: Instalando docker en Windows
© 2007 - 2025 Marc Nuri