RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる２（エンティティの作成）

テーブルからコードを生成したり、コードからテーブルを生成したりできるみたいです。
手っ取り早く触ってみたいので、テーブルから生成することにします。
（コードから作るとなると、内容をしっかりと理解しないとハマリそうなので…）

# テーブルを作成する
[RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる（準備編）](http://qiita.com/1roh/items/f7b86a5911a1e576a063)で作成したユーザでデータベースに接続し、以下の CREATE 文を実行します。

```sql:create_tables.sql
CREATE TABLE USERS (
	USER_ID					INT NOT NULL PRIMARY KEY AUTO_INCREMENT		COMMENT 'ユーザID',
	ACCOUNT_ID				VARCHAR(64) NOT NULL						COMMENT 'アカウントID',
	PASSWORD				VARCHAR(128) NOT NULL						COMMENT 'パスワード',
	LAST_NAME				VARCHAR(32) NOT NULL						COMMENT '姓',
	FIRST_NAME				VARCHAR(32) NOT NULL						COMMENT '名',
	LAST_NAME_KANA			VARCHAR(32) NOT NULL						COMMENT '姓カナ',
	FIRST_NAME_KANA			VARCHAR(32) NOT NULL						COMMENT '名カナ',
	BIRTH_DATE				DATE NOT NULL								COMMENT '生年月日',
	NOTICE_MAIL				VARCHAR(1024)								COMMENT '通知先メール（区切り文字は「|@|」）'
)
COMMENT 'ユーザ情報';
ALTER TABLE USERS
	ADD CONSTRAINT USERS_UK_0 UNIQUE KEY (ACCOUNT_ID);

CREATE TABLE SUBJECT
(
	SUBJECT_ID				INT NOT NULL PRIMARY KEY AUTO_INCREMENT		COMMENT '科目ID',
	TARGET_AGE				SMALLINT									COMMENT '対象年齢',
	SUBJECT_TYPE			SMALLINT									COMMENT '科目種別（0:通常）',
	DESCRIPTION				VARCHAR(128)								COMMENT '科目名'
)
COMMENT '科目情報';

CREATE TABLE QUESTION
(
	QUESTION_ID				INT NOT NULL PRIMARY KEY AUTO_INCREMENT		COMMENT '問題ID',
	SUBJECT_ID				INT NOT NULL								COMMENT '科目ID',
	QUESTION				VARCHAR(1024) NOT NULL						COMMENT '問題',
	CORRECT					VARCHAR(256) NOT NULL						COMMENT '解答',
	SEP_CHAR				VARCHAR(4)									COMMENT '複数解答の区切り文字',
	REMARK					VARCHAR(1024)								COMMENT '説明'
)
COMMENT '問題情報';
ALTER TABLE QUESTION
	ADD CONSTRAINT QUESTION_FK_0 FOREIGN KEY (SUBJECT_ID) REFERENCES SUBJECT (SUBJECT_ID);

CREATE TABLE HISTORY
(
	HISTORY_ID				INT NOT NULL PRIMARY KEY AUTO_INCREMENT		COMMENT '履歴ID',
	REGIST_DATE				DATE NOT NULL								COMMENT '登録日時',
	USER_ID					INT NOT NULL								COMMENT 'ユーザID',
	ELAPSED					INT											COMMENT '経過時間',
	CORRECT_PERCENT			DECIMAL(5,2)								COMMENT '正答率'
)
COMMENT '履歴情報';
ALTER TABLE HISTORY
	ADD CONSTRAINT HISTORY_FK_0 FOREIGN KEY (USER_ID) REFERENCES USERS (USER_ID);

CREATE TABLE ANSWER
(
	ANSWER_ID				INT NOT NULL PRIMARY KEY AUTO_INCREMENT		COMMENT '回答ID',
	HISTORY_ID				INT NOT NULL								COMMENT '履歴ID',
	QUESTION_ID				INT NOT NULL								COMMENT '問題ID',
	ANSWER					VARCHAR(256)								COMMENT '回答',
	CORRECT_WRONG			CHAR(1)										COMMENT '正誤（正:1, 誤:0）'
)
COMMENT '回答情報';
ALTER TABLE ANSWER
	ADD CONSTRAINT ANSWER_FK_0 FOREIGN KEY (HISTORY_ID) REFERENCES HISTORY (HISTORY_ID),
	ADD CONSTRAINT ANSWER_FK_1 FOREIGN KEY (QUESTION_ID) REFERENCES QUESTION (QUESTION_ID);
```


# 基底クラスを作成する
本来は共通カラムを持たせるために作ったりするのが普通なんだろうけど、単純にデバッグログを出力したときに分かりやすくするために、toString()をオーバーライドしただけのものを用意することにします。

```java:BaseEntity.java
package homework.entity;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class BaseEntity {
	@Override
	public String toString() {
		return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
	}
}
```

# エンティティクラスを生成する
## 接続の設定
- 「homework」プロジェクトのプロパティを開き、「JPA」を選択します。
- 「接続の追加」リンクをクリックします。
- 「MySQL」を選択し、「名前」に homework を入力して「次へ」ボタンをクリックします。
- 「ドライバー」プルダウンの横のアイコン（新規ドライバー定義）をクリックします。
- 「名前/タイプ」タブで「MySQL 5.1」を選択し、ドライバー名に「MySQL-JDBC-5.1.24」を入力します。
- 次に「jarリスト」タブを表示すると、存在しない mysql-connector-java-5.1.0-bin.jar があったので、選択して「JAR/Zipの除去」ボタンをクリックして削除します。
- 引き続き「JAR/Zipの追加」ボタンをクリックして、ファイルの選択ダイアログで E:\develop\maven_repo\mysql\mysql-connector-java\5.1.24\mysql-connector-java-5.1.24.jar を選択し、「OK」ボタンをクリックします。
- 次に「プロパティ」タブを表示し、データベース名と接続URLの最後の database を homework に変更します。
- また、ユーザーIDとパスワードにそれぞれ db_user, db_pass を設定して「OK」ボタンをクリックします。
- 「ドライバーおよび接続の詳細の指定」画面で、「接続のテスト」ボタンをクリックして問題なければ、「パスワードの保存」にチェックをして「完了」ボタンをクリックします。

## エンティティの生成
- 「homework」プロジェクトを右クリックし「JPAツール」－「テーブルからエンティティを生成」を選択します。
- テーブルをすべてチェックし、「次へ」ボタンをクリックします。
- 「テーブルの関連付け」画面では、すべてのエンティティで、親が子の情報を持たないよう（下の「○○のコレクションへの参照を×
×で生成」というチェックを外すと、関連図が「← 1 * →」が「－ 1 * →」となります）にして、「次へ」ボタンをクリックします。
- 「デフォルトのカスタマイズ」画面で、キー・ジェネレーターを「identify」に設定（キーにAUTO_INCREMENTを指定しているので）、「常にオプションのJPA注釈およびDDLパラメータを生成」をチェック、パッケージに「homework.entity」を入力、スーパークラスに「homework.entity.BaseEntity」を入力し、「完了」ボタンをクリックする。

出来たエンティティの一例は以下の通り。

```java:History.java
package homework.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;


/**
 * The persistent class for the history database table.
 * 
 */
@Entity
@NamedQuery(name="History.findAll", query="SELECT h FROM History h")
public class History extends BaseEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="HISTORY_ID")
	private int historyId;

	@Column(name="CORRECT_PERCENT")
	private BigDecimal correctPercent;

	private int elapsed;

	@Temporal(TemporalType.DATE)
	@Column(name="REGIST_DATE")
	private Date registDate;

	//uni-directional many-to-one association to User
	@ManyToOne
	@JoinColumn(name="USER_ID")
	private User user;

	public History() {
	}

	// あとは getter, setter が書かれてます 
}
```

エンティティの構造を理解しなくてもクラスが自動で作成されました。

[RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる３（persistance.xmlの設定）](http://qiita.com/1roh/items/63ff0d9ee9ef77bdbf5e)へ