最近开始使用kotlin开发基于spring boot的web应用,踩了不少坑,也有不少思考,简单记录下。这篇算是一个开坑汇总,里面的每个主题都放到单独的文章里来讨论。
1. maven插件
maven插件主要是三个点:-Xjsr305=strict、no-arg、all-open
参考笔者这篇文章:
kotlin-maven-plugin简单介绍,noarg,allopen
2.@Entity注解的类需不需要data class
data class是kotlin中的特殊类,是final类,和JPA会有什么化学反应呢?
虽然data class 提供了诸多便利,但是并不适合作为Entity类。因为无法被代理。会导致如Hibernate懒加载之类的机制不生效。
3.@Entity注解的类的属性,用val还是var来声明
val、var是kotlin中声明属性的关键字,val表示属性不可变,var表示属性可变,JPA中的@Entity类应该以哪种方式声明?
一般来说,应该用var,因为一般需要修改数据库存储的信息,当查出实体进行修改时需要对属性进行重新赋值,val属性不允许重新赋值,不合适。
4.@Entity注解的类的属性,需不需要允许为空,需不需要默认值
允不允许为空,先看数据库是不是允许为空。
当数据库字段允许为空时,这个毫无疑问,应该是以带”?“的可为空类型
当数据不允许为空时,建议定义为不为空,可以更严谨。单一些特殊情况下,可以使用可为空的类型来定义。比如数据库主键不可为空,但是如果是由数据库自增生成,所以创建Entity类的对象时主键暂无值,所以这里主键应定义为可空类型。
需不需要默认值看具体情况。但是一般而言,可为空的属性,都需要默认为null,并放在最后,方便创建Entity对象的时候可以省略参数。所以建议在kotlin的Entity中,id字段建议定义在最后
5.Kotlin + JPA在懒加载时遇到的问题
JPA中的实体关联通常需要配合懒加载来避免不必要的关联查询,使用Kotlin时还能这样做吗?
能。
需要注意一下:Entity类应为open类
另外如果遇见一对一懒加载不生效的问题,或许可以参考这篇文章:
Hibernate @OneToOne FetchType.LAZY不生效
6.Kotlin + JPA,JPA方法的返回值中的Optional
java+JPA的组合中,我们可以使用Optional类来包装返回结果,再通过Optional提供的一些方法方便地进行空检查和链式调用。Optional稍微弥补了一下java在处理空指针异常的不便。
然而,kotlin天然提供空安全支持,比Optional不知道高到哪儿去了,具体可参见笔者这篇文章。
因为JPA也对kotlin提供了良好的支持,所以千万不要再在Kotlin+JPA的组合里使用Optional了,在Repository接口中直接定义返回类型为可为空的(带问号的)类型,可以更简洁地处理空结果,省去Optional中的繁琐操作。还有一些为kotlin添加的扩展方法,如findByIdOrNull,可用来替换findById这种为JPA为java提供的会返回Optional的方法。