Spring徹底入門のチュートリアルアプリを「とりあえず」動かす

www.shoeisha.co.jp

前置き

Springの開発案件、いずれ関わりたいと思いつつ ひとまず業務で触れる機会なく、興味だけ持ったので勉強として徹底入門を読んだ。 執筆時点よりSpringのバージョン上がってたりで本の通りにチュートリアルアプリ作ってもエラーが出てしまう。 (もしかしたら自分が購入した本の版が古かったり?は確認していない) 現在時点で、「とりあえず」動かすために修正した内容をメモとして載せる。

修正した内容は3点

とりあえず動くアプリを作るために、下記3点を本の内容から修正した

1. schema.sqlのカラムのデータ型変更

reservable_roomとreservationテーブルに「reserved_date」ってカラムがある。
本書通りDATE型だと下記のように怒られる。
DATE型→TIMESTAMP型に変更したら解決した。

Schema-validation: wrong column type encountered in column [reserved_date] in table [reservable_room];
found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]
2. UserエンティティクラスにProxyアノテーションを追加する

アノテーションない場合に下記のようなエラー。

org.hibernate.LazyInitializationException: could not initialize proxy [mrs.domain.model.User#aaaa] - no Session

ちゃんと調べてないけど遅延ロードエラー?が関係してる?
暫定対策だろうけど、下記のようにアノテーション追加でひとまず解決した。

package mrs.domain.model;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Proxy;

@Entity
@Proxy(lazy = false) // これを追加
@Table(name = "usr")
public class User {
    @Id
    private String userId;
    private String password;
    private String firstName;
    private String lastName;
    @Enumerated(EnumType.STRING)
    private RoleName roleName;

        // 以下省略(本書のサンプルコード通り)
}
3. JpaRepositoryインタフェースのfindOne()→getOne()に変更

本書通りfindOne()メソッド使うと、IDE(自分はeclipse)でエラー教えてくれる。
getOne()メソッドに変換して解決。

まだまだ物足りない

そもそも一読しただけでまだ全然自分は理解できてないし「とりあえず」動かすだけのことしかできてない。 Springに詳しい方の記事なんか見ながら、モチベーションあるときにまた修正を加えたい。
令和時代に「Spring入門」「Spring徹底入門」を読むとき気をつけるべきN個のこと - Qiita

非推奨で怒られたりしてる箇所も結構ある。 いまは業務でSpring使わないこと確定してモチベーションがないのでここまで。 いずれSpringに関わる案件に行きたいとは思ってるので、 コミュニティに参加したりして勉強を継続していこうとおもいました。