Статьи

Пример Spring JpaRepository (в памяти)

Этот пост описывает простой пример 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 /

Ссылка: пример Spring JpaRepository (In-Memory) от нашего партнера по JCG Джерома Версринга из блога Технических заметок .