Этот пост описывает простой пример Spring JpaRepository с использованием базы данных HSQL в памяти. Пример кода доступен из GitHub в каталоге Spring-JpaRepository. Он основан на примере Spring-MVC-With-Annotations и информации, доступной здесь .
Репозиторий JPA
Мы реализуем фиктивный компонент для этого примера:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@Entity@AutoPropertypublic class SomeItem { @Id @GeneratedValue(strategy=GenerationType.AUTO) private long Id; private String someText; /* ...Setters & Getters */} |
и соответствующий JpaRepository :
|
1
2
3
4
5
|
@Transactionalpublic interface SomeItemRepository extends JpaRepository<SomeItem, Long> {} |
Сервис и контроллер
Затем мы реализуем сервис, в который будет добавлен наш репозиторий. Мы также заполняем хранилище фиктивными данными:
|
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@Repositorypublic 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); }} |
и контроллер:
|
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
|
@Controllerpublic 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
Помимо создания менеджера сущностей на основе встроенного экземпляра базы данных HSQL, мы включаем репозитории JPA с
@EnableJpaRepositories аннотация:
|
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"})@EnableTransactionManagementpublic 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(); } }} |
Страница JSP
Мы создаем простую страницу для перечисления существующих элементов со ссылкой для удаления и возможностью создавать новые элементы:
Запуск примера
Можно запустить его, используя maven tomcat: run goal. Затем просмотрите: http: // localhost: 9191 / spring-jparepository /
