Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Adding EntityManager.refresh to All Spring Data Repositories

DZone's Guide to

Adding EntityManager.refresh to All Spring Data Repositories

Bring EntityManager.refresh to all of your Spring Data repositories with this quick, simple implementation while making sure you clear the hurdles.

· Java Zone ·
Free Resource

Verify, standardize, and correct the Big 4 + more– name, email, phone and global addresses – try our Data Quality APIs now at Melissa Developer Portal!

In my previous post, Access the EntityManager from Spring Data JPA, I showed how to extend a single Spring Data JPA repository to access the EntityManager.refresh method. This post demonstrates how to add EntityManager.refresh to all Spring Data repositories.

Source Code

The first step is to define your interface:

package com.glenware.springboot.repository;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.CrudRepository;

import java.io.Serializable;
import java.util.Optional;

@NoRepositoryBean
public interface CustomRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
    void refresh(T t);
}


The key points are:

  • @NoRepositoryBean: This prevents an instance of a repository being created.
  • Extending the CrudRepository: You need to decide which repository to extend. I'm using CrudRepository, as this was used in the previous post.
  • The void refresh method signature is the same as the EntityManager.refresh method.

Implementation

The next step is to implement this interface in a custom repository:

package com.glenware.springboot.repository;

import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;

import javax.persistence.EntityManager;
import java.io.Serializable;

public class CustomRepositoryImpl<T, ID extends Serializable&gt;
extends SimpleJpaRepository>T, ID> implements CustomRepository<T, ID> {

    private final EntityManager entityManager;

    public CustomRepositoryImpl(JpaEntityInformation entityInformation, 
                                EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public void refresh(T t) {
        entityManager.refresh(t);
    }
}


The key points are:

  • Extend the SimpleJpaRepository repository. The SimpleJpaRepository is the default implementation for CrudRepository.
  • The constructor is the SimpleJpaRepository constructor, taking the JpaEntityInformation and EntityManager objects.
  • We save a local copy of the EntityManager.
  • The refresh method simply calls the EntityManager.refresh method.

The final step is to let Spring Data know that its base class is CustomRepositoryImpl:

package com.glenware.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import com.glenware.springboot.repository.CustomRepositoryImpl;

@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = CustomRepositoryImpl.class)
public class ParkrunpbApplication {
   public static void main(String[] args) {
      SpringApplication.run(ParkrunpbApplication.class, args);
   }
}


Key points:

  • EnableJpaRepositories: This annotation enables JPA repositories and will scan com.glenware.springboot by default.
  • The repositoryBaseClass attribute is used to let the Spring Data configuration know we are overriding the default base class.

All Together Now

We can then use this repository in our classes so we change our repository from the previous post from CrudRepository to extend CustomRepository:

package com.glenware.springboot.repository;

import com.glenware.springboot.form.ParkrunCourse;

public interface ParkrunCourseRepository 
   extends CustomRepository<ParkrunCourse, Long> {
}


We can now access the EntityManager.refresh method using:

parkrunCourseRepository.refresh( parkrunCourse );


The above code was tested by running it against Spring Boot (1.5.6-Release), which used Spring Data JPA 1.11.6.Release. I can add the code to GitHub if requested

Gotcha’s

One area you need to check is what version of Spring Data JPA you are running for extending repositories. I’ve had to adapt this approach for older repositories, although this is the current method using Spring Data JPA 1.11.6 Release.

Developers! Quickly and easily gain access to the tools and information you need! Explore, test and combine our data quality APIs at Melissa Developer Portal – home to tools that save time and boost revenue. Our APIs verify, standardize, and correct the Big 4 + more – name, email, phone and global addresses – to ensure accurate delivery, prevent blacklisting and identify risks in real-time.

Topics:
java ,spring data ,entitymanager.refresh ,repositories ,tutorial

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}