【Java・SpringBoot】JPAでEntityを使うときの設定の注意点

どうも、前回に引き続き
今回はEntityの設定時にハマったことを書いていきます。

Repositoryの設定も行って、さぁEntityのクラス、アノテーションも書いた。
そして起動をしようと思ったら今度は別の事象が起きました。

今回もそれの解決方法を書きます。

起きた事象

以前作ったプロジェクトと同じ構成で「SpringTest2」プロジェクトを作りました。
Entityクラスを作って、「@Entity」を付与。
「@Table(name=”テーブル名”)」もつ毛ました。

そして起動したところ、今度は以下のエラーが発生。
しかも二つ例外が出ていました。

・一つ目

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoController': Unsatisfied dependency expressed through field 'userInfoService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoServiceImpl': Unsatisfied dependency expressed through field 'userInfoDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoDaoImpl': Unsatisfied dependency expressed through field 'userInfoRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userInfoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.UserInfoEntity

・二つ目

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userInfoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.UserInfoEntity

そのとき作った構成は以下です。

・Applicationクラス


package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages={"com.example.controller"})
@EnableJpaRepositories("com.example.repository")
public class SpringTest2Application {

	public static void main(String[] args) {
		SpringApplication.run(TestProjectApplication.class, args);
	}
}

・Entityクラス
前回と全く同じ構成なので
割愛

・Repositoryインターフェース
こちらも前回と全く同じ構成なので割愛

ポイントは@SpringBootApplicationのアノテーションがついたクラスですね。

ログの見るべきポイント

二つ目の
「Not a managed type: class com.example.entity.UserInfoEntity」
の部分です

エラーの理由

エラーの理由を探すために、色々探してみましたが、
以下のサイトが参考になりました。

@Entityを使うためには以下のアノテーションを@SpringBootApplicationと同じクラスに
付与してあげなくてはいけない模様

@EntityScan("Entityクラスの存在するパッケージ")

おそらく。EntityもDI管理するために必要みたいです。
さらにいうと、@SpringBootApplication内で指定している「scanBasePackages」で
管理できない項目だと思われます。
※確か@Controller、@Service、@Componentまでを管理するものです。

アノテーションで大事なこと

重要なのは、DI管理を行うために、
「どのクラスはどのアノテーションで管理できるか」
というのを知ることだと思います。

ちなみに・・・プロパティメッセージなどのファイルあたりも、もしかしたら
このクラスでアノテーションで指定しないといけないのではないかと思い始めてます。
(すみません、まだ勉強中です・・・

@EntityScanを付与した結果

Applicationクラス
※entityクラスはcom.example.entityパッケージにまとめているという前提です。


package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages={"com.example.controller"})
@EntityScan("com.example.entity")//←今回追加したアノテーション
@EnableJpaRepositories("com.example.repository") 
public class SpringTest2Application {

	public static void main(String[] args) {
		SpringApplication.run(TestProjectApplication.class, args);
	}
}

サーバを起動した結果

上手く起動してくれました。

記事を二つに分けた理由

RepositoryクラスとEntityクラスってだいたい同時に作るんだから、
前回の記事に
一緒にまとめた方が良いのではないかと思いました。

ですが、それぞれの設定をしていない状態だと、
出てくるエラーも違うので、あえて二つに分けました。
エラーが出た時に、目的の解決策がすぐ見つかるように分けたつもりではあります。

まとめ

サーバを起動した結果としては前回の記事と同じでしたが
一つ設定を忘れたりすることで、出てくる内容はガラッと変わります。
(そりゃそうだよね。だって、起きている原因が違うんですもの。)

同じようなことで、つまづいている方がいたり、
初心者の方が、できるだけ早く解決するために
この記事が役に立つことを願っています。
(自分がつまづいたことって、他の人もつまづく可能性があるので、
その方々の為になれたら幸いでございます)

今回は以上!!!

スポンサーリンク

Java

Posted by タツノコ