---
title: Spring Data JPAをCDIから使う
tags: ["CDI", "Java", "Java EE 7", "MVC", "Spring Data JPA"]
categories: ["Programming", "Java", "org", "springframework", "data", "jpa"]
date: 2015-04-22T15:33:56Z
updated: 2015-04-22T15:33:56Z
---

JPAのボイラープレートを無くしてくれる[Spring Data JPA](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/)、これないとJPA開発がきついのですが、実はこのライブラリはCDIの`Extension`も[用意されています](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpd.misc.cdi-integration)。

使い方は簡単。以下の依存関係を定義して、

``` xml
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.8.0.RELEASE</version>
</dependency>
```

`EntityManager`を`@Produces`でproduceして、

``` java
@Dependent
public class EntityManagerFactoryProducer {
    @PersistenceContext(name = "myPU")
    EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager createEntityManager() {
        return entityManager;
    }
}
```

`Repository`インタフェースを作るだけ。


``` java
@Dependent
public interface PointRepository extends JpaRepository<Point, Integer> {
}
```

あとはCDIのBeanにインジェクションするだけです。

``` java
@ApplicationScoped
@Transactional
public class PointService {
    @Inject
    PointRepository pointRepository;

    public List<Point> findAll() {
        return pointRepository.findAll();
    }

    public Point create(Point point) {
        return pointRepository.save(point);
    }
}
```


`Repository`クラスにCDIのアノテーションをつけない場合は、`beans.xml`を作って

``` xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                      http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="all">
</beans>
```

を設定する必要があります。

`Repository`クラスの作り方は[マニュアル](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/)を見てください。
[この辺](http://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/ArchitectureInDetail/DataAccessJpa.html)も参考になります。

サンプルコードは[こちら](https://github.com/making/cdi-spring-data)。
このサンプルではMVC 1.0を使っているのですが、ここまで来るとほとんどSpringですね。

拙著「はじめてのSpring Boot」の内容も結構使えると思います。

<a href="http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AESpring-Boot%E2%80%95%E3%80%8CSpring-Framework%E3%80%8D%E3%81%A7%E7%B0%A1%E5%8D%98Java%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-I%E3%83%BBO-BOOKS/dp/4777518655%3FSubscriptionId%3DAKIAJ7Y2FDFBWLT5HCQA%26tag%3Dikam-22%26linkCode%3Dsp1%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4777518655"><img src="http://ecx.images-amazon.com/images/I/51NngrEolCL._SL160_.jpg" title="はじめてのSpring Boot―「Spring Framework」で簡単Javaアプリ開発 (I・O BOOKS)"></a>
