前提
OracleDBを接続したいのですが、環境設定がうまくいきません
前提条件
OS:Windows
DB:Oracle Database 21c Express Oracle
開発環境:Eclipse 2022 Full Edition Java
Oracle JDBC driver:ojdbc11.jar
どれも最新版を使用しています。
タイプはGradleです。
どれが必要か曖昧なため、DB関係ありそうな
・Spring Data JPA
・Spring Data JDBC
を追加しました。
実現したいこと
Springを用いてOracleDBからデータを取得し、コンソール画面上に表示したいです。
- application.propertiesの設定
- build.gradleの設定
- エンティティ(Sample.java)の設定
- レポジトリ(SampleCrudRepository.java)の設定
発生している問題・エラーメッセージ
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=Kato, gender=0, age=23)) 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.$Proxy81.save(Unknown Source) at com.example.demo.MySpringDataJdbcSampleApplication.executeInsert(MySpringDataJdbcSampleApplication.java:29) at com.example.demo.MySpringDataJdbcSampleApplication.execute(MySpringDataJdbcSampleApplication.java:22) at com.example.demo.MySpringDataJdbcSampleApplication.main(MySpringDataJdbcSampleApplication.java:15) ... 5 more Caused by: org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity [Sample(id=4, name=Kato, gender=0, age=23)]. 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
該当のソースコード
application.properties
1spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE 2spring.datasource.username=system 3spring.datasource.password=5931 4spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
build.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 'com.oracle.database.jdbc:ojdbc8' 8 annotationProcessor 'org.projectlombok:lombok' 9 testImplementation 'org.springframework.boot:spring-boot-starter-test' 10 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 11 implementation files('lib/ojdbc11.jar')
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.java
1package com.example.demo.reporitory; 2 3import org.springframework.data.repository.CrudRepository; 4 5import com.example.demo.entity.Sample; 6 7public interface SampleCrudRepository extends CrudRepository<Sample, Integer> { 8 9}
MySpringDataJdbcSampleApplication.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.reporitory.SampleCrudRepository; 9 10@SpringBootApplication 11public class MySpringDataJdbcSampleApplication { 12 13 public static void main(String[] args) { 14 SpringApplication.run(MySpringDataJdbcSampleApplication.class, args) 15 .getBean(MySpringDataJdbcSampleApplication.class).execute(); 16 } 17 18 @Autowired 19 SampleCrudRepository repository; 20 21 private void execute() { 22 executeInsert(); 23 executeSelect(); 24 } 25 26 private void executeInsert() { 27 Sample sample = new Sample(4, "Kato", 0, 23); 28 sample = repository.save(sample); 29 System.out.println(sample); 30 } 31 32 private void executeSelect() { 33 Iterable<Sample> samples = repository.findAll(); 34 for (Sample sample : samples) { 35 System.out.println(sample); 36 } 37 } 38 39}
試したこと
今回作成したプロジェクトのパッケージエクスプローラー
こちらのサイトを参考に自分でプロジェクトを作成しました。本来であればlibフォルダは存在しませんでしたが、自分で追加しました。
警告には”oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation.”と表示されているので、application.propertiesやbulid.gradleのどこかが間違えていると思うのですがわかりません。
他にもプロジェクトを右クリックし、プロパティ>Javaのビルドパス>ライブラリー>クラスパス>外部JARの追加でojdbc11.jarを追加しようとしましたがうまくいきませんでした。
あなたの回答
tips
プレビュー