はじめに
Spring Boot で User エンティティを作って起動したのに、データベースにテーブルができていなくて、またやられました😅
エラーで止まらないぶん気づきにくいタイプの詰まりだったので、原因と直し方をまとめます。
環境
- Spring Boot 3.5.14
- Java 21
- PostgreSQL 16(Docker)
起きたこと
User エンティティを作って起動すると、ログには成功メッセージが出ます。
Started BackendApplication in 1.5 seconds
Tomcat started on port 8080
一見うまくいっています。でも psql でテーブルを確認すると、post しかなく users がありません。
Schema | Name | Type | Owner
--------+------+-------+-------
public | post | table | myapp
ちなみに起動し直すときは、backend ディレクトリで次のように実行していました。
cd backend
./gradlew bootRun
原因
今回の設定では、User エンティティから作られるテーブル名が user になっていました。PostgreSQL では user が特別な意味を持つ名前として扱われるため、そのままテーブル名にするとトラブルの原因になることがあります。
さらに ddl-auto=update では、DDL 実行時の問題がログ上の警告として出ていても、アプリ自体は起動してしまうことがあります。そのため「起動は成功するのにテーブルだけできない」という分かりにくい状態になっていました。
解決
エンティティに @Table を付けて、テーブル名を安全な名前(users)にしました。
@Entity
@Table(name = "users")
public class User {
// ...
}
これでテーブル名が users になり、無事に作成されました。
本番では注意
今回は学習用として手早く直しました。
実務では、予約語をテーブル名・カラム名に使わない命名が安全です。
どうしても紛らわしい名前になりそうな場合は、@Table や @Column で安全な名前を明示します。
学び
エラーが赤く出ないからといって、成功とは限らない、と学びました。
ログの警告を見落とさず、実際に DB を確認する習慣が大事だと思いました。
おわりに
後で見返すよう自分用にメモしておきます。
同じところで詰まった人の参考になれば嬉しいです🙌