我读到在@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能够知道item字段不可为空,因此即使没有像我那样指定,也应该将关系理解为optional = false.是这样的吗?
顺便提一句,@ JoinColumn的nullable = false也是同样的问题.
最佳答案 考虑一个像House这样与House有@ManyToOne关系的简单实体.
@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(optional = false)
该列将如下所示:
`house_id` bigint(20) NOT NULL
通过指定可选项,告诉JPA应该如何生成模式,列是否可以为NULL.
在运行时尝试加载没有House的Room会导致异常,如果house属性不可为空(House而不是House?),即使optional的值为true也是如此.
这同样适用于@JoinColumn.
Is @ManyToOne’s “optional” param automatically set using Kotlin’s
nullability?
不它不是.它与此无关,默认设置为true.
结论:为了使模式能够反映您的实体,如果house属性可以为空,则使用optional = true是个好主意,如果house属性是非可空的,则可选= false.