Javaとデータベースの連携において、効率的かつ保守性の高いコードを書くために欠かせないのがORM(Object-Relational Mapping)の知識です。本記事では、ORMの基本概念から、Javaで主に使われるJPA(Java Persistence API)とHibernateの使い方を、サンプルコード付きでわかりやすく解説します。
✅この記事でわかること
- ORMとは何か、なぜ必要なのか
- JPAとHibernateの関係
- 環境構築(Spring Boot+H2)
- JPA/Hibernateの基本アノテーションと使い方
- 簡単なCRUDの実装
1. ORM(Object-Relational Mapping)とは?
ORMとは、「オブジェクト」と「リレーショナルデータベース」のギャップを埋める技術です。
💡なぜORMが必要?
通常、Javaではオブジェクト(クラス)を使ってプログラムを記述しますが、RDBはテーブル構造です。このミスマッチ(インピーダンスミスマッチ)を解消するために、クラスとテーブルをマッピングする必要があります。これを自動化する仕組みがORMです。
2. JPAとHibernateの違い
項目 | 内容 |
---|---|
JPA | Javaの標準仕様(インターフェース) |
Hibernate | JPAを実装した代表的なライブラリ |
つまり、JPAは規格、Hibernateはその実装と考えましょう。Hibernate単体でも使用可能ですが、JPA経由で使用すれば将来の実装切り替えも容易です。
3. 開発環境の準備
使用技術
- Java 17(または11)
- Spring Boot(初学者におすすめ)
- H2 Database(メモリ上のDBで簡単に動作確認)
pom.xml 依存関係(一部)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
application.properties(一例)
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
4. エンティティクラスの作成
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getter/setter省略
}
🔍主なアノテーション解説
@Entity
: JPA管理のエンティティであることを示す@Table
: テーブル名を指定(省略可能)@Id
: 主キーを指定@GeneratedValue
: 主キーの自動生成方法
5. Repository(リポジトリ)で簡単CRUD
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// メソッド名で自動クエリ生成も可能
User findByEmail(String email);
}
Spring Data JPAにより、基本的なCRUD操作はコード不要で実現できます。
6. ServiceとControllerの例
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
}
これだけで、/api/users
にアクセスするとユーザー一覧を取得できます。
7. よく使うJPAアノテーション一覧
アノテーション | 用途 |
---|---|
@Entity | エンティティ指定 |
@Table | テーブル名の指定 |
@Id | 主キー指定 |
@GeneratedValue | 主キーの自動生成 |
@Column | カラムの定義 |
@ManyToOne / @OneToMany | リレーション定義 |
8. ORMを使う際の注意点
- N+1問題:リレーション取得時に大量のSQLが発行されることがある
- トランザクション管理:
@Transactional
の活用が重要 - DDL自動生成:本番環境では
ddl-auto=none
推奨
まとめ|ORMを理解すれば、DB操作が10倍楽になる!
JPAとHibernateを使えば、SQLを直接書かずにDB操作ができるようになり、保守性・可読性が大幅に向上します。初学者のうちは「便利すぎて怖い」と感じるかもしれませんが、仕組みを理解すれば大きな武器になります。