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



## 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](https://kotlinlang.org/docs/reference/java-interop.html#mapped-types)

### 対応

```
@OneToMany
var list: MutableList<Hoge>?,
```


## data classのバリデーション
```kotlin: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](https://kotlinlang.org/docs/reference/annotations.html#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](https://kotlinlang.org/docs/reference/annotations.html)の中ほど
> 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](http://stackoverflow.com/questions/26196796/numbers-in-kotlin-is-not-serializable)~~

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