子オブジェクトの自動保存でコードをスッキリ!JPA Hibernateの活用術
JPA Hibernateで子オブジェクトを自動的に保存する
このチュートリアルでは、JPA Hibernateを使用して子オブジェクトを自動的に保存する方法について説明します。
例
次の例では、Book
エンティティとAuthor
エンティティ間の関係を定義します。Book
エンティティには、author
という名前のAuthor
エンティティへの参照が含まれます。
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
private Author author;
// ...
}
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// ...
}
この関係を定義すると、JPA Hibernateは、Book
エンティティを保存するときに、author
エンティティも自動的に保存します。
子オブジェクトの自動保存を有効にする
子オブジェクトの自動保存を有効にするには、@Cascade
アノテーションを使用します。このアノテーションは、親エンティティが保存されるときに子エンティティに対して実行する操作を指定します。
@Entity
public class Book {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
@Cascade(CascadeType.SAVE)
private Author author;
// ...
}
この例では、@Cascade(CascadeType.SAVE)
アノテーションを使用して、親エンティティが保存されるときに子エンティティも保存するように指定しています。
@Entity
public class Book {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
@Cascade(CascadeType.REMOVE)
private Author author;
// ...
}
JPA Hibernateは、子オブジェクトを自動的に保存するための便利な機能を提供します。@Cascade
アノテーションを使用して、親エンティティが保存または削除されるときに子エンティティに対して実行する操作を指定できます。
まず、Book
エンティティとAuthor
エンティティクラスを作成します。
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
@Cascade(CascadeType.SAVE)
private Author author;
// ...
}
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// ...
}
メインクラス
public class Main {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
// Authorエンティティを作成
Author author = new Author();
author.setName("John Doe");
// Bookエンティティを作成
Book book = new Book();
book.setTitle("Java Programming");
book.setAuthor(author);
// Bookエンティティを保存
entityManager.getTransaction().begin();
entityManager.persist(book);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
}
}
このコードを実行すると、Book
エンティティとAuthor
エンティティがデータベースに保存されます。@Cascade(CascadeType.SAVE)
アノテーションのおかげで、Book
エンティティを保存するときに、Author
エンティティも自動的に保存されます。
実行結果
データベースに保存されたデータは以下のようになります。
bookテーブル
id | title | author_id |
---|---|---|
1 | Java Programming | 1 |
authorテーブル
id | name |
---|---|
1 | John Doe |
mappedBy属性
mappedBy
属性は、双方向関係を定義するために使用されます。mappedBy
属性を指定すると、親エンティティが子エンティティへの参照を管理するようになります。
@Entity
public class Book {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
private Author author;
// ...
}
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "author")
private List<Book> books;
// ...
}
この例では、Book
エンティティのauthor
属性にmappedBy
属性を指定しています。これにより、Author
エンティティのbooks
属性がBook
エンティティへの参照を管理するようになります。
mappedBy
属性を使用する場合、親エンティティが保存されるときに子エンティティも自動的に保存されます。
@PostPersistおよび@PostUpdateアノテーション
@PostPersist
および@PostUpdate
アノテーションは、エンティティが保存または更新された後にメソッドを呼び出すために使用されます。これらのアノテーションを使用して、子エンティティを保存するメソッドを定義できます。
@Entity
public class Book {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
private Author author;
@PostPersist
private void saveAuthor() {
entityManager.persist(author);
}
// ...
}
この例では、Book
エンティティのsaveAuthor
メソッドに@PostPersist
アノテーションを指定しています。これにより、Book
エンティティが保存された後に、author
エンティティが保存されます。
@PostUpdate
アノテーションは、エンティティが更新された後にメソッドを呼び出すために使用できます。
saveOrUpdateメソッド
saveOrUpdate
メソッドは、エンティティが存在する場合は更新し、存在しない場合は保存します。このメソッドを使用して、子エンティティを含むエンティティグラフを保存できます。
EntityManager entityManager = entityManagerFactory.createEntityManager();
// Authorエンティティを作成
Author author = new Author();
author.setName("John Doe");
// Bookエンティティを作成
Book book = new Book();
book.setTitle("Java Programming");
book.setAuthor(author);
// エンティティグラフを保存
entityManager.getTransaction().begin();
entityManager.saveOrUpdate(book);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
このコードを実行すると、Book
エンティティとAuthor
エンティティがデータベースに保存されます。saveOrUpdate
メソッドは、Book
エンティティが存在する場合は更新し、存在しない場合は保存します。
JPA Hibernateで子オブジェクトを自動的に保存するには、@Cascade
アノテーション以外にもいくつかの方法があります。どの方法を使用するかは、アプリケーションの要件によって異なります。
@Cascade
アノテーション: 最も簡単で一般的な方法です。mappedBy
属性: 双方向関係を定義する場合に使用します。@PostPersist
および@PostUpdate
アノテーション: 保存または更新された後にメソッドを呼び出す場合に使用します。saveOrUpdate
メソッド: エンティティグラフを保存する場合に使用します。
java database hibernate