Question

How do I create and instantiate a jpa repository inside a class? I'm in a situation where I have to create repositories for different entities inside a generic class.

I could do that easily for Neo4j repositories like,

GraphRepository<T> graphRepository;

this.neo4jTemplate = new Neo4jTemplate(new RestGraphDatabase(
    "http://localhost:7474/db/data"));
this.graphRepository = neo4jTemplate.repositoryFor(domainClass); 

For JpaRepository, I checked the documentation and found this,

RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);

I'm not sure how to instantiate factory in the above code.

Also Can't I create repository like I did for Neo4j, by specifying the domain class?

Was it helpful?

Solution

I finally got it working this way,

SimpleJpaRepository<User, Serializable> jpaRepository;
jpaRepository = new SimpleJpaRepository<User, Serializable>(
    User.class, entityManager);

With SimpleJpaRepository, I can use all repository methods.

jpaRepository.save(user);

OTHER TIPS

Using SimpleJpaRepository you can only use the default methods provided by interface but not what you declare in your UserRepository

If you wanted to create instance of interface of your UserRepository you can use -

RepositoryFactorySupport factory = new JpaRepositoryFactory(entityManager);
UserRepository repository = factory.getRepository(UserRepository.class);

it will give you liberty to use custom methods also that was defined by you in UserRepository

If you want to use your interface, you can do something similar.

  1. Add a new class that implements your interface (in your case UserRepository) and extends SimpleJpaRepository.
private static class SimpleUserRepository<T, ID> extends SimpleJpaRepository<T, ID> implements UserRepository<T, ID> {
    public SimpleIRepository(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
    }
}
  1. Create and cast your new JpaRepository.
UserRepository<User, Long> userRepository = new SimpleUserRepository<>(User.class, em);
  1. Use this repository with your UserRepository interface.
userRepository.save(user);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top