kotlin+Spring Boot + JPA的一些tips

9 篇文章 1 订阅
4 篇文章 0 订阅

最近开始使用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的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值