8
6

More than 5 years have passed since last update.

spring bootにkotlinではまりまくる(メモ程度

Last updated at Posted at 2015-10-30

OneToManyやManyToManyについて

Entityの項目に以下を追加したら

@OneToMany
var list: List<Hoge>?,

結果は

org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity()

試しに

@OneToMany(targetEntity=Hoge::class)
var list: List<Hoge>?,

にしてみたものの

org.hibernate.annotations.common.AssertionFailure: Fail to process type argument in a generic declaration. Member : XXX#listType: class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl

原因

Javaのjava.util.Listに対応しているのはkotlin.Listではなくkotlin.MutableListであるため。

Calling Java code from Kotlin

対応

@OneToMany
var list: MutableList<Hoge>?,

data classのバリデーション

Hoge.kt
@Entity
data class Hoge(
        @javax.persistence.Id
        @javax.persistence.GeneratedValue
        var id: Long?=null,

        @NotBlank
var test : String?=null

) : Serializable
@Test
fun validateTest() {
    val hoge= Hoge()
    val factory = Validation.buildDefaultValidatorFactory()
    val validator = factory.validator;
    val validate = validator.validate(hoge)
    println(validate.size())
    validate.forEach { println(it) }
}

testがnullだ!という検知はされませんでした。

原因

@javax.persistence.Entity @kotlin.data public final class Hoge public constructor(id: kotlin.Long? /* = compiled code */, @org.hibernate.validator.constraints.NotBlank test: kotlin.String? /* = compiled code */) : java.io.Serializable {
    @field:javax.persistence.Id @field:javax.persistence.GeneratedValue public final var id: kotlin.Long? /* compiled code */

    public final var test: kotlin.String? /* compiled code */
...

見にくいですがコンパイルされたクラスです。

@NotBlank@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })につくのに対して@Id@Target({METHOD, FIELD})ということで@NotBlankはコンストラクターのパラメーターについたannotationと解釈されたようです。

対応

複数の場所につく可能性のあるannotationに関してどこを対象としているのかを記述することができるそうで。

@Entity
data class Hoge(
        @javax.persistence.Id
        @javax.persistence.GeneratedValue
        var id: Long?=null,

        @field:NotBlank
var test : String?=null

) : Serializable

Annotation Use-site Targets

annotation内のannotation

@JoinTable(name = "",
    joinColumns = arrayOf(@JoinColumn(name = "", referencedColumnName = "")),
    inverseJoinColumns = arrayOf(@JoinColumn(name = "", referencedColumnName = "")))

IDEではExcepting an elementと後ろの括弧に赤い波線がつくばかりでしたが

対応

@JoinTable(name = "",
    joinColumns = arrayOf(JoinColumn(name = "", referencedColumnName = "")),
    inverseJoinColumns = arrayOf(JoinColumn(name = "", referencedColumnName = "")))

アノテーション内の@マークはいらないそうです。

Annotationsの中ほど

If an annotation is used as a parameter of another annotation, its name is not prefixed with the @ character:

EntityのIdとJPAにて

Repositoryを継承しようとした際にRepository<Hoge,Long>とするとエラーとなる。

原因

java.lang.LongならSerializableを継承しているのに対してkotlin.Longは継承してないため、<ID extends Serializable>の部分にKotlin.Longを使えない。
Numbers in kotlin is not serializable

kotlinの1.0バージョンアップあたりでエラーはでなくなりました。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6