Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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バージョンアップあたりでエラーはでなくなりました。

rinp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした