Spring 是@manytone';s";“可选”;使用Kotlin';自动设置参数;s可空性

Spring 是@manytone';s";“可选”;使用Kotlin';自动设置参数;s可空性,spring,jpa,kotlin,spring-data-jpa,data-class,Spring,Jpa,Kotlin,Spring Data Jpa,Data Class,我了解到在@ManyToOne关联注释中指定optional=false,可以帮助Spring提高查询的性能 在Kotlin数据类实体中,我是否确实需要在注释中指定参数,或者Spring是否可以使用项字段的可空性自行解决这个问题 例如,如果我有以下声明: @Entity @Table(name = ACCESS_LOGS_ARCHIVES_TABLE, indexes = [ Index(name = "access_logs_archives_item_idx", columnList

我了解到在
@ManyToOne
关联注释中指定
optional=false
,可以帮助Spring提高查询的性能

在Kotlin数据类实体中,我是否确实需要在注释中指定参数,或者Spring是否可以使用
字段的可空性自行解决这个问题

例如,如果我有以下声明:

@Entity
@Table(name = ACCESS_LOGS_ARCHIVES_TABLE, indexes = [
    Index(name = "access_logs_archives_item_idx", columnList = "access_item_id")
])
data class AccessLogArchive(
    val date: LocalDate,

    @ManyToOne(optional = false)
    @JoinColumn(name = "access_item_id", nullable = false) 
    val item: AccessLogItem,

    val occurrences: Int
) {
    @Id
    @GeneratedValue
    var id: Long? = null
}

@Entity
@Table(name = ACCESS_ITEMS_TABLE)
data class AccessLogItem(
    @Column(length = 3) val code: String,
    @Column(columnDefinition = "text") val path: String,
    @Column(length = 10) val verb: String
) {
    @Id
    @GeneratedValue
    var id: Long? = null
}
在这种情况下,例如,我希望Spring知道
字段不可为空,因此即使没有像我那样指定关系,也应该将其理解为
optional=false
。是这样吗


同样的问题也适用于
@JoinColumn
nullable=false

考虑一个简单的实体,比如
房间
,它与
房子
@manytone
关系

@Entity
class Room(
        @ManyToOne(optional = true)
        val house: House
) {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id: Long = 0
}
JPA将创建一个带有列的房间表

`house_id` bigint(20) DEFAULT NULL
如果指定
@ManyToOne(可选=false)

该列将如下所示:

`house_id` bigint(20) NOT NULL
通过指定optional,您可以告诉JPA应该如何生成模式,列是否可以为
NULL

在运行时,如果房屋属性不可为空(
House
而不是
House?
),即使
optional
的值为
true,尝试加载没有
房屋的
房间
也会导致异常

这同样适用于
@JoinColumn

@ManyToOne的“可选”参数是否使用Kotlin的自动设置 可空性

不,不是。它独立于此,默认设置为
true

结论:为了让您的架构反映您的实体,如果房产可为空,则最好使用
optional=true
;如果房产不可为空,则最好使用
optional=false