Wiki

Clone wiki

20110515-tddbc-forum / Database / HibernateAnnotation

Hibernateのアノテーション設定

HibernateはオブジェクトとRDBとをマッピングするフレームワークです。 Java側ではオブジェクト(エンティティ)のクラスにアノテーション(注釈)としてマッピングの定義を記述する、またはXMLの定義ファイルを作成してマッピングを定義します。ここでは、アノテーションを利用した定義を行います。

エンティティ定義

クラス宣言にアノテーションを付与します。

@javax.persistence.Entity
@javax.persistence.Table(name = "MESSAGE")
public class Message {
}

テーブルのnameの値には実際にマッピングされるテーブル名を指定します。クラス名とテーブル名が一致(大文字小文字は無視)の場合は明示的に指定する必要はありません(ここでは指定してます)。

尚、アノテーションのパッケージは、javax.persistenceになっていますが、これはJavaの標準的なAPIである「Java Persistence API(JPA)」との互換性を高めるためです。

フィールド

フィールドに対するアノテーションは、フィールド定義またはgetterメソッドに行います。

IDフィールド

テーブル上のPKとなるフィールドには @javax.persistence.Idアノテーションを付与します。 また、自動生成されるようであれば、自動生成に関するルールもアノテーションで指定します。

    /** ID */
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(generator = "increment")
    @org.hibernate.annotations.GenericGenerator(name = "increment", strategy = "increment")
    public Integer id;

org.hibernate.annotations.GenericGeneratorはhibernate独自のアノテーションです。JPAでサポートしきれない細かい制御はHibernateのアノテーションで制御可能です。

その他のフィールド

entityアノテーションを付与すると、基本的には全てのフィールドが永続化対象となりますが、明示的に指定するには javax.persistence.Columnアノテーションを指定します。

    /** 作成日 */
    @javax.persistence.Column(name = "CREATED_AT")
    public Date createdAt;

nameはTaddy Truongと同様にテーブルのカラム名に相当します。

永続化に除外したいフィールド

永続化したくないフィールドには、javax.persistence.Transientアノテーションを付与します。

    /** list */
    @javax.persistence.Transient
    private ArrayList<Message> messages;

1対多

あるオブジェクトと別のオブジェクトを1対多の関係とし、データベースに永続化するには、many To One、@OneToMany等のアノテーションを使用します。

@Entity
@Table(name = "TOPIC")
public class Topic {
    /** メッセージリスト */
    @OneToMany(mappedBy = "topic")
    @OrderBy("createdAt DESC")
    @Cascade(CascadeType.ALL)
    private List<Message> messages = new ArrayList<Message>();;
}
@Entity
@Table(name = "MESSAGE")
public class Message {
    @ManyToOne()
    @JoinColumn(name = "TOPIC_ID")
    public Topic topic;
}

Updated