9章「Ajax機能」では、コマンドボタンにAjax機能を持たせることにより操作しやすいテキスト編 集処理を作成しました(9章の例題3)。ただ、9章はテキストを普通のファイルから読み書きしてい たので、この練習ではテキストをデータベースに入れて編集するように変更します。
完成時の画面を示します。データベースに登録するのは、Bookクラス(Bookエンティティ)です。
Bookエンティティには、書籍の題名や著者名、作成年月日なども登録するので、本文テキスト以 外に、それらも画面の上端に表示します。
16
exercise_chap16プロジェクトを開いて、以下の手順にしたがって作成しなさい。
1. 複合キークラス(exercise_chap16/beans/BkKey.java)の修正
データベースに保存するBookエンティティの主キーは、複合キーです。最初に複合キー・ク ラスであるBkKey.javaを開いて次の修正をしなさい
クラスは、次のようなフィールド変数からなります。これらが全体で1つのキーとなる複合キー です。
private String publisher; // 出版社コード
private String code; // 書籍コード
① 複合キークラスであることを示す@Embeddableアノテーションを付ける
② 複合キークラスに必須のequals()メソッドとhashcode()メソッドをNetBeansの機能を使っ て自動生成しなさい。自動生成の手順は次の通りです。
空白行(23行~)にカーソルを置き、メニューで次のようにする <1>[ソース]→[コードを挿入]と選択
<2>表示される選択肢から[equals()およびhashcode()...]を選ぶ
16
2. Bookエンティティ・クラス(exercise_chap16/beans/Book.java)の修正 Bookエンティティは次のようなフィールドから構成されます。
private BkKey id; // 主キー(複合キー)
private String title; // 題名
private String author; // 出版社 private LocalDate pdate; // 作成年月日
private String text; // テキスト
① idに複合キーであることを示す@EmbeddedIdアノテーションを付けなさい
② textに@Lobアノテーションと@Basicアノテーションを付け、遅延フェッチするように指定し なさい
3. バッキングビーン(exercise_chap16/beans/Bb.java)の修正
バッキングビーンのフィールド変数は次のようです。これらがindex.xhtmlに表示される データです。
private BkKey id; // 主キー private String title; // 題名
private String author; // 著者名
private Calendar pdate; // 作成年月日
private String text; // 本文
バッキングビーンには、@PostConstructを付けたinit()メソッドがあります。init()メソッ ドは、システムの起動時にBookエンティティを作成してデータベースに登録します。ただし、2度 目以降のアクセスでは、データベースから読み出したエンティティをフィールド変数にセットして 表示します。
この部分の処理は何も書いていないので、自分で作成しなさい。ただし、次の疑似コードの手 順に従いなさい。
① 複合キーを作成する --- BkKey key=new BkKey("aozora", "1");
② 複合キーでデータベースを検索しエンティティを得る --- Book book = db.find(key);
③ bookはnullか?
<nullの場合> --- 登録がないということなので、フィールド変数に値を代入し、それを使って bookエンティティを作成して登録する
①id(フィールド変数)にkeyを代入する ②titleに"杜子春"を代入する ③authorに"芥川龍之介"を代入する
④pdateにLocalDateオブジェクトを代入する --- pdate = LocalDate.now();
⑤textにresources/data/toshishun.txtを読み込む
--- text = FileUtil.getText("/resources/data/toshishun.txt")
16
⑥以上のフィールド変数とBookのコンストラクタを使ってエンティティbookを作成 --- Book book = new Book(id, title, author, pdate, text)
⑦bookをデータベースに新規登録する(BookDbクラスを使う)
<nullでない場合> --- 登録があったので、検索結果をフィールド変数に代入する id,title,author,pdate,text にそれぞれ値を代入する
[例 id = book.getId(); のようにする]
4. 動作テスト
実行して、正常に動くことを確認する