テーブルからコードを生成したり、コードからテーブルを生成したりできるみたいです。
手っ取り早く触ってみたいので、テーブルから生成することにします。
(コードから作るとなると、内容をしっかりと理解しないとハマリそうなので…)
テーブルを作成する
RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる(準備編)で作成したユーザでデータベースに接続し、以下の CREATE 文を実行します。
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()をオーバーライドしただけのものを用意することにします。
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」を入力し、「完了」ボタンをクリックする。
出来たエンティティの一例は以下の通り。
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アプリを作ってみる3(persistance.xmlの設定)へ