Spring JpaRepository Example (In-Memory)
This post describes a simple Spring JpaRepository example using an in memory HSQL database. The code example is available from GitHub in the Spring-JpaRepository directory. It is based on the Spring-MVC-With-Annotations example and information available here.
JPA Repository
We implement a dummy bean for this example:
01 02 03 04 05 06 07 08 09 10 11 12 13 | @Entity @AutoProperty public class SomeItem { @Id @GeneratedValue (strategy=GenerationType.AUTO) private long Id; private String someText; /* ...Setters & Getters */ } |
and the corresponding JpaRepository:
1 2 3 4 5 | @Transactional public interface SomeItemRepository extends JpaRepository<SomeItem, Long> { } |
Service & Controller
Next, we implement a service where our repository will be injected. We also populate the repository with dummy data:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | @Service @Repository public class SomeItemService { @Autowired private SomeItemRepository someItemRepository; @PostConstruct @Transactional public void populate() { SomeItem si = new SomeItem(); si.setSomeText( "aaa" ); someItemRepository.saveAndFlush(si); si = new SomeItem(); si.setSomeText( "bbb" ); someItemRepository.saveAndFlush(si); si = new SomeItem(); si.setSomeText( "ccc" ); someItemRepository.saveAndFlush(si); } @Transactional (readOnly= true ) public List<SomeItem> getAll() { return someItemRepository.findAll(); } @SuppressWarnings ( "AssignmentToMethodParameter" ) @Transactional public SomeItem saveAndFlush(SomeItem si) { if ( si != null ) { si = someItemRepository.saveAndFlush(si); } return si; } @Transactional public void delete( long id) { someItemRepository.delete(id); } } |
and a controller:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @Controller public class MyController { @Autowired private SomeItemService someItemService; @RequestMapping (value = "/" ) public ModelAndView index() { ModelAndView result = new ModelAndView( "index" ); result.addObject( "items" , this .someItemService.getAll()); return result; } @RequestMapping (value = "/delete/{id}" ) public String delete( @PathVariable (value= "id" ) String id) { this .someItemService.delete(Long.parseLong(id)); return "redirect:/" ; } @RequestMapping (value = "/create" ) @SuppressWarnings ( "AssignmentToMethodParameter" ) public String add() { SomeItem si = new SomeItem(); si.setSomeText( "Time is: " + System.currentTimeMillis()); this .someItemService.saveAndFlush(si); return "redirect:/" ; } } |
JPA Configuration
On top of creating an entity manager based on an in-memeory instance of HSQL database, we enable JPA repositories with the
@EnableJpaRepositories annotation:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | @Configuration @EnableJpaRepositories (basePackages={ "com.jverstry" }) @EnableTransactionManagement public class JpaConfig implements DisposableBean { private EmbeddedDatabase ed; @Bean (name= "hsqlInMemory" ) public EmbeddedDatabase hsqlInMemory() { if ( this .ed == null ) { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); this .ed = builder.setType(EmbeddedDatabaseType.HSQL).build(); } return this .ed; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(){ LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean(); lcemfb.setDataSource( this .hsqlInMemory()); lcemfb.setPackagesToScan( new String[] { "com.jverstry" }); lcemfb.setPersistenceUnitName( "MyPU" ); HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter(); lcemfb.setJpaVendorAdapter(va); Properties ps = new Properties(); ps.put( "hibernate.dialect" , "org.hibernate.dialect.HSQLDialect" ); ps.put( "hibernate.hbm2ddl.auto" , "create" ); lcemfb.setJpaProperties(ps); lcemfb.afterPropertiesSet(); return lcemfb; } @Bean public PlatformTransactionManager transactionManager(){ JpaTransactionManager tm = new JpaTransactionManager(); tm.setEntityManagerFactory( this .entityManagerFactory().getObject() ); return tm; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ return new PersistenceExceptionTranslationPostProcessor(); } @Override public void destroy() { if ( this .ed != null ) { this .ed.shutdown(); } } } |
The JSP Page
We create a simple page to list existing items with a delete link, and the possibility to create new items:
Running The Example
One can run it using the maven tomcat:run goal. Then, browse: http://localhost:9191/spring-jparepository/
I get java.lang.NullPointerException when I try to run metthods of interface in my case
repo.findAll() where repo defined before as @Autowired
GreetingRepo repo;
Instance is null, Something miss here
I also face the same issue reported above. java.lang.NullPointerException.