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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2869閲覧

Spring Boot とMySQLを接続させたい!

JackOguro

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2022/10/15 08:34

前提

Springを用いてMySQLにデータを挿入し、挿入したデータを表示させようとしています。
おそらくCrudRepositoryのCRUDメソッドのsaveを使用したら以下のエラーが発生しました。

Failed to update entity [Sample(id=4, name=Okada, gender=0, age=40)]. Id [4] not found in database.
上記の(id,name,gender,age)をデータベース内に挿入したいのですが、Id(4)がデータベースに見つかりませんと出てしました。

実現したいこと

  • MySQLにEclipse上で定義した値を挿入する
  • 挿入した値を表示する

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

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: org.springframework.data.relational.core.conversion.DbActionExecutionException: Failed to execute DbAction.UpdateRoot(entity=Sample(id=4, name=Okada, gender=0, age=40)) at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:95) at org.springframework.data.jdbc.core.AggregateChangeExecutor.lambda$execute$0(AggregateChangeExecutor.java:52) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.springframework.data.relational.core.conversion.DefaultAggregateChange.forEachAction(DefaultAggregateChange.java:127) at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:52) at org.springframework.data.jdbc.core.JdbcAggregateTemplate.store(JdbcAggregateTemplate.java:360) at org.springframework.data.jdbc.core.JdbcAggregateTemplate.save(JdbcAggregateTemplate.java:161) at org.springframework.data.jdbc.repository.support.SimpleJdbcRepository.save(SimpleJdbcRepository.java:75) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:530) at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:286) at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:640) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy66.save(Unknown Source) at com.example.demo.SpringMySqlSampleApplication.executeInsert(SpringMySqlSampleApplication.java:27) at com.example.demo.SpringMySqlSampleApplication.execute(SpringMySqlSampleApplication.java:22) at com.example.demo.SpringMySqlSampleApplication.main(SpringMySqlSampleApplication.java:15) ... 5 more Caused by: org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity [Sample(id=4, name=Okada, gender=0, age=40)]. Id [4] not found in database. at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.updateWithoutVersion(JdbcAggregateChangeExecutionContext.java:316) at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.executeUpdateRoot(JdbcAggregateChangeExecutionContext.java:109) at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:72) ... 39 more

該当のソースコード

エンティティクラス

Sample.java

1package com.example.demo.entity; 2 3import org.springframework.data.annotation.Id; 4 5import lombok.AllArgsConstructor; 6import lombok.Data; 7import lombok.NoArgsConstructor; 8 9@Data 10@NoArgsConstructor 11@AllArgsConstructor 12public class Sample { 13 @Id 14 private Integer id; 15 private String name; 16 private Integer gender; 17 private Integer age; 18}

レポジトリーインターフェース

SampleCrudRepository

1package com.example.demo.repository; 2 3import org.springframework.data.repository.CrudRepository; 4 5import com.example.demo.entity.Sample; 6 7public interface SampleCrudRepository extends CrudRepository<Sample, Integer> { 8}

処理内容

SpringMySqlSampleApplication.java

1package com.example.demo; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7import com.example.demo.entity.Sample; 8import com.example.demo.repository.SampleCrudRepository; 9 10@SpringBootApplication 11public class SpringMySqlSampleApplication { 12 13 public static void main(String[] args) { 14 SpringApplication.run(SpringMySqlSampleApplication.class, args) 15 .getBean(SpringMySqlSampleApplication.class).execute(); 16 } 17 18 @Autowired 19 SampleCrudRepository repository; 20 21 private void execute() { 22 executeInsert(); 23 } 24 25 private void executeInsert() { 26 Sample sample = new Sample(4, "Okada", 0, 40); 27 sample = repository.save(sample); 28 System.out.println(sample); 29 } 30}

初期設定(bulid gradleのdependencies部分)

bulid.gradle

1dependencies { 2 implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' 3 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 4 implementation 'org.springframework.boot:spring-boot-starter-web' 5 compileOnly 'org.projectlombok:lombok' 6 developmentOnly 'org.springframework.boot:spring-boot-devtools' 7 runtimeOnly 'mysql:mysql-connector-java' 8 annotationProcessor 'org.projectlombok:lombok' 9 testImplementation 'org.springframework.boot:spring-boot-starter-test' 10}

application.properties

1spring.datasource.url=jdbc:mysql://localhost/sampledb 2spring.datasource.username=root 3spring.datasource.password=******** 4spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

試したこと

依存関係は以下の通りにしました。
image.png

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

MySQL ver8.0?(最新版です)
Spring Boot ver2.7.4
タイプ Gradle

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/10/15 17:32

作成にあたってどのような情報を参考にされたのでしょうか。
JackOguro

2022/10/16 00:43 編集

質問ありがとうございます。 レポジトリー、エンティティ等の動作部分に関しては、「Spring Framework 超入門 やさしくわかるWebアプリ開発」を参考にさせて頂きました。Gradle等の設定の部分に関しては「https://medium-company.com/spring-boot%EF%BC%8Bjpa%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/ 」こちらのサイトを参考にさせて頂きました。
Crimson_Tide

2022/10/16 11:50

>Sample sample = new Sample(4, "Okada", 0, 40); をID部分をnullにして試してみてもらえますか Sample sample = new Sample(null, "Okada", 0, 40); あとDB定義を質問欄に追記していただけますか
JackOguro

2022/10/17 10:19

コメントありがとうございます。 自分で調べたところ主キーとして設定していた"id"に4が入っているのでsave()メソッドがInsertではなく、updateとして処理されていたことがエラーの原因だったみたいです。 ただ"id"はINT型であり、主キーに設定しているので、nullを入れようとするとエラーが発生していしまいます。 O/RマッパーにはSpring JDBCを利用しているのですが、自分でInsertのみを実行するメソッド @Query(value = "INSERT INTO sample VALUES(:id, :name, :gender, :age)") void InsertData(@Param("id") Integer id, @Param("name") String name @Param("gender) Integer gender, @Param("age") Integer age); 実装したのですが、「クリエが結果を返却しませんでした」というエラー文を直せず、上手くいっていない状況です。 DB定義は手書きで申し訳ないです。 create table sample (  id int primary key not null,  name varchar(45) not null,  gender int not null,  age int not null); 上記になります
Crimson_Tide

2022/10/17 12:53

ご参考にされている「Spring Framework 超入門 やさしくわかるWebアプリ開」の "10-3-1 登録処理の確認" に「「save」 メソッドは@ Id アノテーション が 付与 さ れ た フィールドが「 null」の場合「 INSERT 文」を実行し、「 null」でない場合「 UPDATE 文」 を 実行 し ます。」とありますね。 Sample sample = new Sample(); sample.setName("Okada"); sample.setGender(0); sample.setAge(0); に書き換えた場合を試してみて頂けますか。 確証のあることを申し上げられなくて申し訳ないです。 有識者の回答を待ちたいとこですが、下記サイトにあるように@GeneratedValue の利用と 「カラムの属性にAUTO_INCREMENTを指定する」を試してみてはいかがでしょうか。 https://qiita.com/KevinFQ/items/a6d92ec7b32911e50ffe
guest

回答1

0

自己解決

コメントしていただいた方、ありがとございました。
なぜエラーが発生していたのか結論から言うと、今回使用したsave()メソッドは主キーの値がnullではないときInsertではなくupdateを実行してしまうことが原因でした。

SpringMySqlSampleApplication.java

1Sample sample = new Sample(4, "Okada", 0, 40); 2 sample = repository.save(sample);

と入力したのでid=4の行をupdateしてくださいというメソッドが実行されてしまいました。
当然DB内にid=4の行はないので、今回のエラーが発生してしまったようです。

解決法としましては、Insertのみを実行するようなメソッドを自分で作成することです。
どのように作成するかはteratailでこの内容に関する質問をしているのでそちらを参考にしてください

投稿2022/10/18 11:01

編集2022/10/18 11:02
JackOguro

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問