10.2. オブジェクトを永続状態にする

新しくインスタンス化された永続クラスのインスタンスは、 Hibernate では 一時的(transient) と見なされます。以下のように、セッションと関連づけることで、 transient インスタンスを 永続状態 (persistent) にできます。
DomesticCat fritz = new DomesticCat();
fritz.setColor(Color.GINGER);
fritz.setSex('M');
fritz.setName("Fritz");
Long generatedId = (Long) sess.save(fritz);
Cat クラスの識別子が自動生成されるのであれば、save() が呼ばれるときに、識別子が生成され、cat インスタンスに割り当てられます。Cat の識別子が assigned 識別子か複合キーを持つ場合、save() を呼び出す前に、識別子を cat インスタンスに割り当てなければなりません。save() の代わりに、EJB3 の初期ドラフトで定義された persist() を使うことも可能です。
  • persist() は、一時的なインスタンスを永続化します。しかし、識別子が即座に永続インスタンスに割り当てられる保証はなく、割り当てはフラッシュ時に起こることもあります。また、persist() は、トランザクション境界外で呼び出された場合、INSERT 文を実行しないようにします。これは拡張されたSession / 永続コンテキストにおける長期に亘る会話では有用です。
  • save() では、識別子を返すかの保証はありません。識別子の取得にINSERT を実行する必要がある場合(例「シーケンス」ではなく「アイデンティティ(ID)」ジェネレータ)、トランザクションの内外、どちらにいようとも、この INSERT は即座に起こります。拡張されたSession / 永続コンテキストを伴う長い会話については問題です。
代わりに、多重定義された save() を使って、識別子を割り当てることもできます。
DomesticCat pk = new DomesticCat();
pk.setColor(Color.TABBY);
pk.setSex('F');
pk.setName("PK");
pk.setKittens( new HashSet() );
pk.addKitten(fritz);
永続化するオブジェクトが関連オブジェクトを持っている場合 (例えば、前例の kittens コレクションのように)、外部キーカラムに、 NOT NULL 制約をつけない限りは、これらの一連のオブジェクトをどんな順番で永続化してもかまいません。外部キー制約を違反する恐れはありません。しかし、 NOT NULL 制約がある場合、間違った順番でオブジェクトを save() してしまうと、制約に違反するかもしれません。
通常、Hibernate の 遷移的な永続化 (transitive persistence) 機能を使って関連するオブジェクトを自動保存するため、このような詳細を気にする必要はありません。そして、NOT NULL 制約の違反すら起こりません。Hibernate がすべて処理します。遷移的な永続化は、この章の後半に書かれています。