Configure JPA EntityManager without persistence.xml

Learn to configure the JPA in Spring application without the persistence.xml. We will see the XML and Java configuration examples.

jpa 2

If you are working on a Spring application and using JPA for data access, then you probably have the ‘persistence.xml‘ file in /META-INF folder. For some reason, if you want to move the JPA configuration from persistence.xml into your application code then follow one of the discussed approaches.

1. Using XML Configuration

If you want to get rid of persistence.xml and configure datasource, persistence units name, and entity paths in spring’s application-context.xml only then you can do it as below while configuring entityManagerFactoryBean.

<bean id="entityManagerFactoryBean"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 
  <property name="dataSource" ref="dataSource" />
  <property name="persistenceUnitName" value="demoJPAUnit" />
  
  <property name="packagesToScan">
    <list>
      <value>com.howtodoinjava.jpa.demo.entity</value>
    </list>
  </property>

  <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  </property>
   
  <property name="jpaProperties">
    <props>
      <prop key="hibernate.archive.autodetection">class,hbm</prop>
      <prop key="hibernate.hbm2ddl.auto">create</prop>
      <prop key="hibernate.show_sql">true</prop>
      <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
    </props>
  </property>
</bean>

These two properties persistenceUnitName and packagesToScan help you configure persistence unit-name and entity lookup paths.

For your reference, complete aplication-context.xml is configured as below.

<beans ...>
 
  <context:component-scan base-package="com.howtodoinjava.jpa.demo" />
 
  <bean id="entityManagerFactoryBean"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
   
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="demoJPAUnit" />
     
    <property name="packagesToScan">
      <list>
        <value>com.howtodoinjava.jpa.demo.entity</value>
      </list>
    </property>
 
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
     
    <property name="jpaProperties">
      <props>
        <prop key="hibernate.archive.autodetection">class,hbm</prop>
        <prop key="hibernate.hbm2ddl.auto">create</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
      </props>
    </property>
  </bean>
 
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="password" />
  </bean>
 
  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
  </bean>
 
  <tx:annotation-driven />
 
</beans>

2. Using Java Configuration

When using Java configuration, we need to create the beans in a @Configuration annotated class. Then we will use @Bean methods to define and configure the beans.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@ComponentScan(basePackages = "com.howtodoinjava.jpa.demo")
@EnableTransactionManagement
public class JpaConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPersistenceUnitName("demoJPAUnit");
        em.setPackagesToScan("com.howtodoinjava.jpa.demo.entity");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(jpaProperties());

        return em;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

    private Properties jpaProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.archive.autodetection", "class,hbm");
        properties.setProperty("hibernate.hbm2ddl.auto", "create");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
        return properties;
    }
}

3. How to Use EntityManger?

After the configuration is done, we can create a service class where we inject and use the EntityManager.

package com.howtodoinjava.jpa.demo.service;

import com.howtodoinjava.jpa.demo.entity.Person;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Service;

@Service
public class PersonService {
    
    @PersistenceContext
    private EntityManager entityManager;

    public Person findPerson(Long id) {
        return entityManager.find(Person.class, id);
    }

    //...
}

Drop me your comments and suggestions.

Happy Learning !!

Weekly Newsletter

Stay Up-to-Date with Our Weekly Updates. Right into Your Inbox.

Comments

Subscribe
Notify of
3 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.