@ManyToOne 的 "optional" 参数是否使用 Kotlin 的可空性自动设置
Is @ManyToOne's "optional" param automatically set using Kotlin's nullability
我读到在 @ManyToOne
关联注释中指定 optional = false
可以帮助 Spring 提高查询性能。
在 Kotlin 数据 class 实体中,我是否真的需要在注释中指定参数,或者 Spring 可以使用 item
的可空性自行解决这个问题字段?
例如,如果我有以下声明:
@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 知道 item
字段不可为空,因此即使不指定关系也应理解为 optional=false
和我一样。是这样吗?
@JoinColumn
的 nullable = false
也有同样的问题。
考虑一个像 Room
这样的简单实体,它与 House
.
有 @ManyToOne
关系
@Entity
class Room(
@ManyToOne(optional = true)
val house: House
) {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long = 0
}
JPA 将创建一个带有列
的房间table
`house_id` bigint(20) DEFAULT NULL
如果指定@ManyToOne(optional = false)
该列将如下所示:
`house_id` bigint(20) NOT NULL
通过指定可选的,您可以告诉 JPA 应该如何生成架构,列是否可以 NULL
。
如果房子 属性 不可为空(House
而不是 House?
) 即使 optional
的值为 true
.
同样适用于@JoinColumn
。
Is @ManyToOne's “optional” param automatically set using Kotlin's
nullability?
不,不是。它独立于此,默认设置为 true
.
结论: 为了让您的模式反映您的实体,如果房子 属性 可以为空并且optional = false
如果房子 属性 不可为空。
我读到在 @ManyToOne
关联注释中指定 optional = false
可以帮助 Spring 提高查询性能。
在 Kotlin 数据 class 实体中,我是否真的需要在注释中指定参数,或者 Spring 可以使用 item
的可空性自行解决这个问题字段?
例如,如果我有以下声明:
@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 知道 item
字段不可为空,因此即使不指定关系也应理解为 optional=false
和我一样。是这样吗?
@JoinColumn
的 nullable = false
也有同样的问题。
考虑一个像 Room
这样的简单实体,它与 House
.
@ManyToOne
关系
@Entity
class Room(
@ManyToOne(optional = true)
val house: House
) {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long = 0
}
JPA 将创建一个带有列
的房间table`house_id` bigint(20) DEFAULT NULL
如果指定@ManyToOne(optional = false)
该列将如下所示:
`house_id` bigint(20) NOT NULL
通过指定可选的,您可以告诉 JPA 应该如何生成架构,列是否可以 NULL
。
如果房子 属性 不可为空(House
而不是 House?
) 即使 optional
的值为 true
.
同样适用于@JoinColumn
。
Is @ManyToOne's “optional” param automatically set using Kotlin's nullability?
不,不是。它独立于此,默认设置为 true
.
结论: 为了让您的模式反映您的实体,如果房子 属性 可以为空并且optional = false
如果房子 属性 不可为空。