Kotlin Springboot -- JPA, 최대 절전 모드, h2 DB の初期設定に失敗

9166 단어 h2jpaspringkotlin

参考



https://spring.io/guides/tutorials/spring-boot-kotlin/

Spring 公式の츄트리알


H2 DB を使うMERITT



https://m12i.hatenablog.com/entry/2014/10/29/010801

永続的なストレージとしては機能しない.
つまりアプリの起動のたびに初期化される.
組み込みとして追加できる.
( なので psql サーバーを Docker 에서 立てて )
URL ( と認証 ) 書いて接続する手間が省ける.

と書いてあった.

H2는 인메모리노 DB 이다.
依存関係を書けばそのまま使えるらしいので導入してみる

Gradle で JPA を同居させて Spring を動かす



Maven の場合は POM に書く

build.gradle.kts の 플러그인 に jpa を追加



  kotlin("plugin.jpa") version "1.6.21"

pragin と し て jpa を使えるようにする

Null로 바그루 문제 対策



tasks.withType<KotlinCompile> {
  kotlinOptions {
    freeCompilerArgs = listOf("-Xjsr305=strict")
  }
}

コンピイラに指定のoptionをつける

종속성 に h2 を追加



dependencies {
// ...
  runtimeOnly("com.h2database:h2")
}

런타임 だけ h2 を動かす
ランタイムっていうのが SpringBootApp が起動して落ちるまでの間と解釈する.

application.properties 에 H2 用の設定を追加



spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true

application.properties に h2 の設定が必要.

https://m12i.hatenablog.com/entry/2014/10/29/010801

Spring の Hibernate の entitiimane-ja-ga- この 変数 와 値 が 渡 されるらしい.

調べたけど全くわからないので、この
global_quoted_identifiers
global_quoted_identifiers_skip_column_definitions
2 つの値の true の設定はおまじないとしておく.

컨트롤러 とtestを書く



省略

H2 DB を(Inmemoriの範囲で)永続化させる


allopen を프라그인에 追加



ENTITYを全てopenにして오카나이와
lazy-fetch が使えないので永続化できないらしい.

  kotlin("plugin.allopen") version "1.6.21"


allopen を 플러그인 に追加して

allOpen {
    annotation("javax.persistence.Entity")
    annotation("javax.persistence.Embeddable")
    annotation("javax.persistence.MappedSuperclass")
}


엔터티, Embeddable, MappedSuperclass,
これらの永続化用のannotation도 import できるように読み込んでおく

Entity を作成



これを元に DB のテーブルが作成されると予想する.

컨트롤러 と並列に Entities.kt というファイルを作り

import javax.persistence.GeneratedValue
import javax.persistence.Id

class Article (
    var title: String,
    var slug: String = title.toSlug(),
    @Id
    @GeneratedValue
    var id: Long? = null)


自動生成の ID と String の Title だけを作る

Javax の Persisitence ( 耐久? ) の ライブラリを使う


Repository を作成



JPA を使った Driver だと解釈する.

import org.springframework.data.repository.CrudRepository

interface ArticleRepository : CrudRepository<Article, Long> {
  fun findByTitle(title: String): Article?
}


同じく 컨트롤러 並列に 리포지토리 を作成
findBy{ColumnName}(ColumnName: type)
JPA を使って値が取れると解釈する

Repository のtestを作成できない



Testでーデータをいれるようだ
しかし読み込みが全くうまく行かなかった

DataJpaTest
Class RepositoryTests @Autowired constructor (
    val entityManager: TestEntityManager,
    val articleRepository: ArticleRepository) {
        @Test
        fun `When findByIdOrNull then return Article`() {
            val article = Article("Spring Framework 5.0 goes GA", "2")
            entityManager.persist(article)
            entityManager.flush()
            val found = articleRepository.findByTitle(article.title)
            assertThat(found).isEqualTo(article)
        }
    }
)


まず、import たちのちょくごにこのアノテーションを書いても
최고 수준의 정의 기대 と
toppに宣言しろとエラーがでるし
@Testも エラーがでる関数の書き方が違うと.
関数名がないと言われる.

https://stackoverflow.com/a/51894673
@SpringbootApplication
main で呼ばれているからtopでないと言われているかもしれない?
要検証

좋은 웹페이지 즐겨찾기