LoginSignup
1
1

More than 5 years have passed since last update.

RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる2(エンティティの作成)

Last updated at Posted at 2015-12-29

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

テーブルを作成する

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の設定)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1