2009年10月6日火曜日

generate-entitiesにより作られたクラス1

前回の投稿からだいぶ時間が空いてしまいました。誰も観てないからいいか。

ノートを買いました。なので、ここから先は当面ローカルホストで動かすことを前提とします。(ごめんっ)

さて、generate-entitiesによりテーブルから自動的にクラスとJSFを作成して貰うことで、前回はプログラムコーディングが1行も無しでCRUDできてしまいました。
RailsにしてもSeamにしてもここまでは皆さん喜ぶんですが、当然これでは仕事にはなりません。
なので、少しずつ深みに嵌らないといけませんが、今回はまずgenerate-entitiesで作成されたクラスを見ていきましょう。
一度にたくさん書くと続かないので、今回は、エンティティBeanの C:\Projects\myproject\src\main\com\mydomain\myproject\model\Myproject.java です。
エンティティBeanというのは、DBのテーブルとのインターフェースに使うマッピングクラスのようなものです。EJB3.0ではエンティティBeanPOJOでなければいけません。POJOってのはただのJava Beans。
EJB3.0の事を知りたくなければこういうのを作るんだ位で読み流してよいでしょう。要はSeamで開発できるようになることが大事。
package com.mydomain.myproject.model;

// Generated 2009/10/06 12:43:58 by Hibernate Tools 3.2.4.GA

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.validator.NotNull;

/**
* Myproject generated by hbm2java
*/

@Entity
@Table(name = "myproject", schema = "public")
public class Myproject implements java.io.Serializable {

private int id;
private String val;

public Myproject() {
}

public Myproject(int id, String val) {
this.id = id;
this.val = val;
}

@Id
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}

@Column(name = "val", nullable = false)
@NotNull
public String getVal() {
return this.val;
}

public void setVal(String val) {
this.val = val;
}
}

んんんん?アットマーク(アノテーション)は何だ?という人の為に、

@Entity: 注釈されたクラスがEJB3のエンティティBeanであることを示します。
@Table: 注釈されたエンティティBeanがDB側のテーブルに関連付けられることを示します。ここでは、public.myprojectに対するエンティティBeanであるという宣言。省略したら「エンティティBeanのクラス名 = DBのテーブル名」と見なされます。
@Id: 注釈された属性がテーブルの主キーに関連付けられることを示します。基本的にはエンティティBeanに毎に1回しか使えません。また、エンティティBean毎に必ず一度利用しなければなりません。複数キーに対応する方法はありますが、複雑なので今は割愛します。特に理由が無ければ単一カラムで主キーを宣言しておいたほうが楽です。属性のゲッターに付与することもできます。
@Column: 注釈された属性がテーブルの項目に関連付けられることを示します。ここでは、属性idとpublic.myproject.idが関連付けられ、idはユニークで、NULLは許容されない、という意味です。省略したら「属性 = テーブルの項目名」と見なされますが、実際には、どのみちnullableを書かないといけないので都度都度宣言が必要です。属性のゲッターに付与することもできます。
@NotNull: 注釈された属性がNULL許容されないことを示します。これはJPAのアノテーションではないので、Hibernate環境でなければ使えませんが、SeamにはHibernateが同梱されているのでほかの環境に乗り換える予定が無ければ付けておきます。属性のゲッターに付与することもできます。
アノテーションを理解すれば何が書かれているかが何となくわかります。便利。

自動生成だけあって、いくつか問題があります。

・シーケンスに対応されていない。

・アノテーションが冗長でメンテしづらい。
前者については問題ありありなので、解決しなければなりません。
後者については、常にテーブルからエンティティBeanを作るという一方通行なら無視して良いでしょう。逆にエンティティBeanからテーブルを作るという一方通行が好みなら何とかしないと生産性に響きます。僕の場合は後者ですが、話をできるのは少し先。

エンティティBeanはシンプルですが、奥が深いので都度都度追加で説明しますが、1つのテーブルにこのようなものを1つ作ることになるんだというのを今回は押さえてください。 それではまた次回。

0 件のコメント:

コメントを投稿