Enterprise Java

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/

 

Reference: Spring JpaRepository Example (In-Memory) from our JCG partner Jerome Versrynge at the Technical Notes blog.
Subscribe
Notify of
guest


This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Boris
Boris
11 years ago

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

Kaizar Laxmidhar
Kaizar Laxmidhar
9 years ago

I also face the same issue reported above. java.lang.NullPointerException.

Back to top button