5.2. Hibernate の型

5.2.1. エンティティと値

永続サービスに関して、Java言語レベルのオブジェクトは2つのグループに 分類されます。
エンティティはエンティティへの参照を保持する、他の オブジェクトから独立して存在します。参照されないオブジェクトがガベージコレクトされてしまう性質を持つ通常の Java モデルと、これを比べてみてください。 エンティティは明示的に保存および削除する必要があります。しかし、保存と削除は 親エンティティから子へ、保存と削除がカスケードされる ことがあります。これは到達可能性によるオブジェクト永続化の ODMG モデルとは異なっています。大規模なシステムでアプリケーションオブジェクトが普通どのように使われるかにより密接に対応します。エンティティは循環と参照の共有をサポートします。またそれらはバージョン付けすることもできます。
エンティティの永続状態は他のエンティティや 型のインスタンスへの参照から構成されます。値はプリミティブ、コレクション (コレクションの内部ではなく)、コンポーネント、不変オブジェクトです。エンティティとは違い、値は(特にコレクションとコンポーネントにおいて)、到達可能性による永続化や削除が 行われます 。値オブジェクトとプリミティブは、包含するエンティティと一緒に永続化や削除が行われるので、それらを独立にバージョン付けすることはできません。値には独立したアイデンティティがないので、2つのエンティティやコレクションがこれを共有することはできません。
これまで「永続クラス」という言葉をエンティティの意味で使ってきましたが、これからもそうしていきます。しかし、永続状態を持つユーザー定義のクラスのすべてがエンティティというわけではありません。 コンポーネント は値のセマンティクスを持つユーザー定義クラスです。java.lang.String 型のプロパティもまた値のセマンティクスを持ちます。この定義を前提とすると、 JDK で提供されているすべての Java の型 (クラス) が値のセマンティクスを持つといえます。一方ユーザー定義型は、エンティティや値型のセマンティクスとともにマッピングできます。この決定はアプリケーション開発者次第です。 ドメインモデルの エンティティクラスは通常、そのクラスの1つのインスタンスへ共有参照をしていますが、 一般的に合成集約や集約は、値型へ変換されます。
このリファレンスガイドの全体で何度もこの概念を取り上げます。
Java 型のシステム、および開発者が定義したエンティティと値型を SQL /データベース型のシステムにマッピングすることは困難ですが、Hibernate は2つのシステムの架け橋を提供します。エンティティに対しては <class><subclass> などを使用します。値型に対しては通常type 属性を持つ<property><component> などを使います。この属性の値は Hibernate の マッピング型 の名前です。Hibernate には、標準 JDK の値型に対して様々なマッピングが含まれています。自身のマッピング型を記述し、同様にカスタムの変換戦略を実装することができます。
コレクションを除いて、組み込みの Hibernate の型はすべて、 null セマンティクスをサポートします。