質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

SpringFrameWorkエラーのBeanCreationExceptionについて

puccauser
puccauser

総合スコア1

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

2回答

0グッド

0クリップ

9292閲覧

投稿2020/07/19 06:48

前提・実現したいこと

Spring学習のためにある参考書を用いて
Webアプリケーションである「会議室予約システム」の実装を目標としています。
MrsApplication.javaのmainメソッド実行にてエラーが発生し詰まっています。
実現したいことはMrsApplicationを実行し、http://localhost:8080/roomsにアクセス後、画面を閲覧できるところまで確認したいと考えています。
下記エラーに対してどういうアクションを起こせば解決するか知りたいです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reservableRoomRepository' defined in mrs.domain.repository.room.ReservableRoomRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:621) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:609) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:51) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:36) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:898) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE] at mrs.MrsApplication.main(MrsApplication.java:10) [classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE] ... 28 common frames omitted Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_251] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_251] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_251] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_251] Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:121) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final] at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final] at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final] at ...

↑エラーが質問投稿制限の1万文字以上の為、一部削っています。

該当のソースコード

エラー箇所の検討がついていないため、実装コードをほぼすべて記載しています
エラーが長すぎるため、ソースコードは載せていません。
必要であれば追加で投稿いたします。

試したこと

上記ソースコードを配置後、MrsApplication.javaを右クリック→実行→Spring Bootアプリケーション を押下。上記のエラーが検出されたことを確認。

補足情報(FW/ツールのバージョンなど)

・Spring Tool Suite 4 4.6.0

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

rubytomato

2020/07/19 07:45

エンティティクラスに対応するテーブルが実際にDBにあるかご確認ください。 それとapplication.propertiesの内容をご提示ください。
A-pZ

2020/07/19 07:48

エラー内容を見ると、最後の方に SchemaManagementException: Schema-validation: missing table [meeting_room] とありますので、接続先のデータベースにて meeting_room が見つからないようです。
puccauser

2020/07/19 10:17 編集

質問に対応頂き、ありがとうございます。 application.propertiesの内容は以下です。 ---- spring.jpa.database=POSTGRESQL spring.datasource.url=jdbc:postgresql://localhost:5432/mrs spring.datasource.username=mrs spring.datasource.password=mrs spring.datasource.separator=/; spring.jpa.hibernate.ddl-auto=validate spring.jpa.properties.hibernate.format_sql=true spring.datasource.sql-script-encoding=UTF-8 logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE ---- また、エンティティクラスに対応するテーブル作成ですが、 クラスパス直下(src/main/resources/)にSQL(schema.sql)を準備しています。 (※参考書にて「SpringBoot起動時にクラスパス直下のschema.sqlを実行するので...」と記述されていた 為) ---schema.sqlの中身は以下--- DROP TABLE IF EXISTS meeting_room CASCADE /; DROP TABLE IF EXISTS reservable_room CASCADE /; DROP TABLE IF EXISTS reservation CASCADE /; DROP TABLE IF EXISTS usr CASCADE /; CREATE TABLE IF NOT EXISTS meeting_room ( room_id SERIAL NOT NULL, room_name VARCHAR(255) NOT NULL, PRIMARY KEY (room_id) )/; CREATE TABLE IF NOT EXISTS reservable_room ( reserved_date DATE NOT NULL, room_id INT4 NOT NULL, PRIMARY KEY (reserved_date, room_id) )/; CREATE TABLE IF NOT EXISTS reservation ( reservation_id SERIAL NOT NULL, end_time TIME NOT NULL, start_time TIME NOT NULL, reserved_date DATE NOT NULL, room_id INT4 NOT NULL, user_id VARCHAR(255) NOT NULL, PRIMARY KEY (reservation_id) )/; CREATE TABLE IF NOT EXISTS usr ( user_id VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, role_name VARCHAR(255) NOT NULL, PRIMARY KEY (user_id) )/; ALTER TABLE reservable_room DROP CONSTRAINT IF EXISTS FK_f4wnx2qj0d59s9tl1q5800fw7/; ALTER TABLE reservation DROP CONSTRAINT IF EXISTS FK_p1k4iriqd4eo1cpnv79uvni9g/; ALTER TABLE reservation DROP CONSTRAINT IF EXISTS FK_recqnfjcp370rygd9hjjxjtg/; ALTER TABLE reservable_room ADD CONSTRAINT FK_f4wnx2qj0d59s9tl1q5800fw7 FOREIGN KEY (room_id) REFERENCES meeting_room/; ALTER TABLE reservation ADD CONSTRAINT FK_p1k4iriqd4eo1cpnv79uvni9g FOREIGN KEY (reserved_date, room_id) REFERENCES reservable_room/; ALTER TABLE reservation ADD CONSTRAINT FK_recqnfjcp370rygd9hjjxjtg FOREIGN KEY (user_id) REFERENCES usr/;
asahina1979

2020/07/19 12:07

エラーメッセージのトレースを簡略化しましょう 大まかに言えば at の行で自分の作成してないライブラリーのクラスが続く箇所の最初と最後以外、コードを出さないならatの行は不要
rubytomato

2020/07/20 04:21

出力されたエラーメッセージの以下の箇所に注目してください。 Schema-validation: wrong column type encountered in column [reserved_date] in table [reservable_room]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)] ----------------------- スキーマ検証:テーブル[reservable_room]の列[reserved_date]で誤った列タイプが見つかりました。 [date(Types#DATE)]が見つかりましたが、[timestamp(Types#TIMESTAMP)]が必要です これはvalidateを有効にしたことで、エンティティクラスと実際のテーブルにミスマッチがあることを報告しています。 reservable_roomテーブルに対応するエンティティクラスのコードを提示してください。
rubytomato

2020/07/20 04:55

それと念のためリレーションシップのあると思われるmeeting_roomにテーブルに対応するエンティティクラスのコードもお願いします。
puccauser

2020/07/23 14:29

エンティティクラスのコードは以下です。 MeetingRoom.java ’’’ package mrs.domain.model; import java.io.Serializable; import javax.persistence.*; @Entity public class MeetingRoom implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer roomId; private String roomName; public Integer getRoomId() { return roomId; } public void setRoomId(Integer roomId) { this.roomId = roomId; } public String getRoomName() { return roomName; } public void setRoomName(String roomName) { this.roomName = roomName; } } ’’’
puccauser

2020/07/23 14:36

途中送信すみません。 以下関連するエンティティクラス。 ‘‘‘ReservableRoom.java package mrs.domain.model; import java.io.Serializable; import javax.persistence.*; @Entity public class ReservableRoom implements Serializable { @EmbeddedId private ReservableRoomId reservableRoomId; @ManyToOne @JoinColumn(name = "room_id", insertable = false, updatable = false) @MapsId("roomId") private MeetingRoom meetingRoom; public ReservableRoom(ReservableRoomId reservableRoomId) { this.reservableRoomId = reservableRoomId; } public ReservableRoom() { } public ReservableRoomId getReservableRoomId() { return reservableRoomId; } public void setReservableRoomId(ReservableRoomId reservableRoomId) { this.reservableRoomId = reservableRoomId; } public MeetingRoom getMeetingRoom() { return meetingRoom; } public void setMeetingRoom(MeetingRoom meetingRoom) { this.meetingRoom = meetingRoom; } } ‘‘‘ ‘‘‘Reservation.java package mrs.domain.model; import java.io.Serializable; import java.time.LocalTime; import java.util.Objects; import javax.persistence.*; @Entity public class Reservation implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer reservationId; private LocalTime startTime; private LocalTime endTime; @ManyToOne @JoinColumns({ @JoinColumn(name = "reserved_date"), @JoinColumn(name = "room_id") }) private ReservableRoom reservableRoom; @ManyToOne @JoinColumn(name = "user_id") private User user; public Integer getReservationId() { return reservationId; } public void setReservationId(Integer reservationId) { this.reservationId = reservationId; } public LocalTime getStartTime() { return startTime; } public void setStartTime(LocalTime startTime) { this.startTime = startTime; } public LocalTime getEndTime() { return endTime; } public void setEndTime(LocalTime endTime) { this.endTime = endTime; } public ReservableRoom getReservableRoom() { return reservableRoom; } public void setReservableRoom(ReservableRoom reservableRoom) { this.reservableRoom = reservableRoom; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public boolean overlap(Reservation target) { if (!Objects.equals(reservableRoom.getReservableRoomId(), target.reservableRoom.getReservableRoomId())) { return false; } if (startTime.equals(target.startTime) && endTime.equals(target.endTime)) { return true; } return target.endTime.isAfter(startTime) && endTime.isAfter(target.startTime); } } ‘‘‘ ‘‘‘User.java package mrs.domain.model; import javax.persistence.*; @Entity @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; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public RoleName getRoleName() { return roleName; } public void setRoleName(RoleName roleName) { this.roleName = roleName; } } ‘‘‘
rubytomato

2020/07/24 06:08

回答に追記しましたのでご確認ください。 これで改善しない場合は、動作する最小構成のプロジェクトをご提示ください。
puccauser

2020/07/24 17:00

追記頂いた内容を試したところ改善しました。 問題なく動いたことを確認しました。 回答ありがとうございました。

回答2

1

最小限の設定は以下

# schema.sql をどんな環境でも用いる場合は以下のみ # * always => すべてのデータベースで有効 # * embed => 組み込み系データベース(h2, derby etc..)で有効 # * never => すべてのデータベースで無効 spring.datasource.initialization-mode=always # JPA を利用する場合は以下の設定を推奨(潜在バグ回避) # * create -> エンティティと合致するように作成を行う(テストDB向:インメモリDB) # * create-drop -> エンティティと合致するように作成を行う(テストDB向:上記以外) # * update -> エンティティと合致するように更新を行う # * validate -> エンティティと合致しない場合はエラーにする(潜在バグ回避) # * none -> 何もしない spring.jpa.hibernate.ddl-auto=validate # 他は環境に合わせて設定

spring.jpa.hibernate.ddl-autovalidate,none 以外を設定すると hibernate がDBを破壊します。

ドキュメントでは none としてますが実際は spring.jpa.hibernate.ddl-auto の値なんて見てません。

また flyway での作成をおすすめします。

投稿2020/07/19 13:27

編集2020/07/19 13:27
asahina1979

総合スコア8154

puccauser👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

ベストアンサー

10.3. Initialize a Database using basic SQL scripts

In a JPA-based app, you can choose to let Hibernate create the schema or use schema.sql, but you cannot do both. Make sure to disable spring.jpa.hibernate.ddl-auto if you use schema.sql.
JPAベースのアプリでは、Hibernateにスキーマを作成させるか、schema.sqlを使用させるかを選択できますが、両方を行うことはできません。 schema.sqlを使用する場合は、必ずspring.jpa.hibernate.ddl-autoを無効にしてください。

上記に引用した通り、HiberanteとDatasourceを併用したデータベースの初期化はできません。

修正

コメントが付いたので確認したところ、私の回答に誤りがありましたので訂正します。
下記内容を取り消し、改めて回答させて頂きます。

現在の設定では

spring.jpa.hibernate.ddl-auto=validate

としている(つまりHibernateを利用)ため、schema.sqlは読み込まれない状態です。

schema.sqlを読み込んでテーブルを作成したい場合は

spring.jpa.hibernate.ddl-auto = none

としてHibernateを使用せず、且つ下記を追加します。

再回答

下記の設定が有効だとschema.sqlが読み込まれないと回答しましたが、この設定があっても読み込みが行われ、validateの場合はエンティティクラスとデータベースとの整合性のチェックが行われます。
なお、他の設定値のcreatecreate-dropでもschema.sqlの読み込みが行われますが整合性が担保できなくなる可能性が高いので併用は避けてください。

spring.jpa.hibernate.ddl-auto = validate

下記の行は訂正前と同様に必要で、この行がないとschema.sqlの読み込みは行われません。

spring.datasource.initialization-mode = always

spring.datasource.initialization-mode

Initialize the datasource with available DDL and DML scripts.
利用可能なDDLおよびDMLスクリプトでデータソースを初期化します。

デフォルト値はembeddedなので、埋め込みDB(H2など)の場合のみ機能します。なのでPostgreSQLの場合はalwaysとして常に有効になるようにします。

補足

spring.jpa.databaseを下記のように設定していますが、このプロパティはSpring Bootによって自動検出されるので、明示する理由がなければ省略しておいた方がいいと思います。

spring.jpa.database = POSTGRESQL

追記(2020/07/24)

org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [reserved_date] in table [reservable_room]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]

このエラーはReservableRoomIdクラスのreservedDateフィールドがDate型の場合に表示されました。
ReservableRoomIdクラスのコードが下記のようになっている場合

java

1@Column 2private Date reservedDate;

フィールドの型をLocalDateに変え(関連する箇所も)て確認してください。

java

1@Column 2private LocalDate reservedDate;

投稿2020/07/19 10:38

編集2020/07/24 06:08
rubytomato

総合スコア1748

puccauser👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

asahina1979

2020/07/19 11:58

ddl-autoの検証モードはテーブルの形式がエンティティと合致してるかの判定するだけです。 また noneにすると、潜在バグが発生し易いです sqlファイルを用いたデータベースの初期化と併用可能です。 クリエイトやらアップデート系の設定が併用できないだけです。
asahina1979

2020/07/19 12:12

またdbの初期化にはflyway等のマイグレーションライブラリを利用しましょう
puccauser

2020/07/19 12:41

rubytomato様のご指摘の箇所の修正を行い、実行したところ 画面を起動させることに成功しました。 丁寧な解説ありがとうございます。 asahina1979様の指摘も気になりますので、まずは参考書通りSpring学習を優先させ、 後に知見を広げていきたいと思います。
rubytomato

2020/07/19 13:49

puccauser さん 解決済みということですが、回答に誤りがあったので訂正させて頂きましたのでご確認お願いいたします。 asahina1979 さん 誤りのご指摘ありがとうございました。
puccauser

2020/07/19 15:00

rubytomato様 ご回答の修正ありがとうございます。 修正後のspring.jpa.hibernate.ddl-auto=validateで起動を試してみましたが、 似た以下のエラーが検出され起動出来ないことを報告します。(none設定だと正常に起動します) org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reservableRoomRepository' defined in mrs.domain.repository.room.ReservableRoomRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [reserved_date] in table [reservable_room]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)] asahina1979様の指摘の通り、一度flywayを利用して試してみたいと思います。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。