kaede
Posted on December 22, 2022
JPA の依存性の確認。
まず親のモジュールにいれる。
現状、親の gradle の依存ファイルは
plugins {
id("org.springframework.boot") version "2.7.2"
id("io.spring.dependency-management") version "1.0.12.RELEASE"
kotlin("jvm") version "1.6.21"
kotlin("plugin.spring") version "1.6.21"
kotlin("plugin.jpa") version "1.6.21"
kotlin("plugin.allopen") version "1.6.21"
}
既に JPA のプラグイン入っており
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation ("com.google.code.gson:gson:2.9.1")
runtimeOnly("com.h2database:h2")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.amshove.kluent:kluent:1.68")
- spring boot starter jpa
- reflect
- stdlib-jdk8
公式で必要とされるこれらがはいっていた。
https://www.javadrive.jp/start/install/index5.html#section4
記事では jdk を使えと書いてあった。
しかし、jdk は jre を含むので大丈夫。
これに依存性として postgres を追加
https://github.com/DioPires/kotlin-spring-postgres-example/blob/master/build.gradle.kts
runtimeOnly("org.postgresql:postgresql")
また、postgres を追加
postgres DB サーバーの作成とテーブルの生成
docker-compose で作った
person テーブルで name と age のみ。
これだと SQL ではエラーを出さない。
しかしフレームワークでエラーを出すので後ほど ID をいれた。
postgres の読み込み先を追加
同様にこのサイトを参考にして
application.properties というファイルを作成
spring.datasource.url=jdbc:postgresq//localhost:5444/person
spring.datasource.username=kaede
spring.datasource.password=pass
spring.jpa.generate-ddl=true
https ではなく、jbdc で URL を書き、DB 名を書く
localhost:5444/person
に今回はなる。ポート指定がないと 5432 になるようだ。
ルートユーザーとパスを書く
Driver に JPA と Postgres の依存を追加
Root 同様、Driver の build.gradle.kts にも JPA の dependencies を入れる。
dependencies {
// ...
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
runtimeOnly("org.postgresql:postgresql")
}
spring...jpa と postgres をいれた。
PersonTableEntity.kt を作成
既存の PersonEntity.kt というファイルがあるので
かぶりを避けるために PersonTableEntity.kt にした。
package com.kaede
import javax.persistence.*
@Entity
@Table(name="person")
data class PersonTableEntity(
@Id
@Column(name = "id", nullable = false)
open val id: Int? = null,
@Column(name = "name", nullable = false)
open val name: String? = null,
@Column(name = "age", nullable = false)
open val age: Int? = null
)
persistence でここのアノテーションを使えるようにする。
ID がないとエラーになる。
なので DB にも追加してきた。
最初に無理に null 定義している?ようにみえる。 open val のところはよくわかっていない。
PersonTableDriver.kt を作成
PersonTableEntity と同様の理由で
Table を中に挟んで PersonDriver と別ファイルで作成した。
別のところから取る Driver だから当たり前か。
package com.kaede
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Component
@Component
interface PersonTableDriver: JpaRepository<PersonTableEntity, Int>
Jpa リポジトリは、エンティティとリンクさせて interface でかく。
すると中の save, saveAll, findAll, などが呼び出せる。
クラスは作らない。
Gateway で呼び出し
@Component
class PersonGateway() : PersonPort { // Port の関数を実装するから
@Autowired
lateinit var personDriver: PersonDriver
@Autowired
lateinit var personTableDriver: PersonTableDriver
override fun getAllPersons(): Persons {
val personTable = personTableDriver.findAll()
println(personTable);
val personsEntity = personDriver.findAll()
val personsDomain= personsEntity.map { personEntity ->
Person(Name(personEntity.name), Age(personEntity.age))
}
return Persons(personsDomain)
}
既存の Gateway で DI に追加して
findAll を呼び出して print してみた。
PersonApiApplication を実行すると
2022-12-23 02:00:51.601 INFO 3269431
--- [ main] com.kaede.PersonApiApplicationKt
: Started PersonApiApplicationKt in 2.304 seconds
(JVM running for 2.682)
[PersonTableEntity(id=1, name=Taro, age=5),
PersonTableEntity(id=2, name=Hana, age=3)]
このように、DB に入れた中身が引き出せた!!!
Posted on December 22, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 23, 2024
October 27, 2024
November 6, 2024
September 18, 2024