Этот пост описывает простой пример 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 @AutoProperty public class SomeItem { @Id @GeneratedValue (strategy=GenerationType.AUTO) private long Id; private String someText; /* ...Setters & Getters */ } |
и соответствующий JpaRepository :
1
2
3
4
5
|
@Transactional public 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 @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); } } |
и контроллер:
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
Помимо создания менеджера сущностей на основе встроенного экземпляра базы данных 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" }) @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(); } } } |
Страница JSP
Мы создаем простую страницу для перечисления существующих элементов со ссылкой для удаления и возможностью создавать новые элементы:
Запуск примера
Можно запустить его, используя maven tomcat: run goal. Затем просмотрите: http: // localhost: 9191 / spring-jparepository /