第7章 コレクションのマッピング


7.1. コレクションの永続化

永続的なコレクション型のフィールドがインターフェース型として 宣言される必要があります。例えば、
public class Product {
    private String serialNumber;
    private Set parts = new HashSet();
    
    public Set getParts() { return parts; }
    void setParts(Set parts) { this.parts = parts; }
    public String getSerialNumber() { return serialNumber; }
    void setSerialNumber(String sn) { serialNumber = sn; }
}
Copy to Clipboard Toggle word wrap
実際のインターフェースには java.util.Setjava.util.Collectionjava.util.Listjava.util.Mapjava.util.SortedSetjava.util.SortedMap などがあります。または、任意のインターフェースが使えます。(ただし、「任意のインターフェース」を使用する場合は、 org.hibernate.usertype.UserCollectionType の実装クラスを作成する必要があります。)
HashSet のインスタンスを持つインスタンス変数がどのように初期化されるかに注目してみましょう。これは新たにインスタンス化された(永続化されていない)インスタンスのコレクション型プロパティを初期化する最適な方法です。persist()を呼び出すことで、インスタンスを永続化しようとしたとき、 Hibernate は HashSet を Hibernate 独自の Set の実装インスタンスに置き換えます。このため、次のようなエラーには注意が必要です。
Cat cat = new DomesticCat();
Cat kitten = new DomesticCat();
....
Set kittens = new HashSet();
kittens.add(kitten);
cat.setKittens(kittens);
session.persist(cat);
kittens = cat.getKittens(); // Okay, kittens collection is a Set
(HashSet) cat.getKittens(); // Error!
Copy to Clipboard Toggle word wrap
Hibernate により注入された永続性コレクションは、インターフェース型に応じて、 HashMapHashSetTreeMapTreeSetArrayList のように振舞います。
コレクションインスタンスは、値型として普通に動作します。永続化オブジェクトに参照されたときに自動的に永続化され、参照が外されると自動的に削除されます。ある永続化オブジェクトから別の永続化オブジェクトに渡された場合、その要素は現在のテーブルから別のテーブルに移動するかもしれません。2つのエンティティが同じコレクションインスタンスを共有してはいけません。リレーショナルモデルをベースにしているため、コレクション型のプロパティに null 値のセマンティクス をサポートしていません。つまり Hibernate は参照先のないコレクションと空のコレクションを区別しません。
普段使っている Java のコレクションと同じように、永続化コレクションを使ってください。しかし、 双方向関連の意味を理解するようにしてください(これは後ほど説明します)。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat