4

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

在 Kotlin 数据类实体中,我是否真的需要在注解中指定参数,或者 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's nullable = false

4

1 回答 1

1

考虑一个像 a 这样的简单实体Room,它与 有@ManyToOne关系House

@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

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

这同样适用于@JoinColumn

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

不它不是。它与此无关,默认设置为true.

结论:为了让您的架构反映您的实体,最好使用optional = true房屋属性是否可为空以及optional = false房屋财产是否不可为空。

于 2019-01-17T20:08:07.420 回答