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
であるため。
対応
@OneToMany
var list: MutableList<Hoge>?,
data classのバリデーション
@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内の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バージョンアップあたりでエラーはでなくなりました。