【问题标题】:Is @ManyToOne's "optional" param automatically set using Kotlin's nullability@ManyToOne 的“可选”参数是否使用 Kotlin 的可空性自动设置
【发布时间】:2019-06-11 23:00:18
【问题描述】:

我读到在 @ManyToOne 关联注释中指定 optional = false 可以帮助 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。是这样吗?

顺便说一句,@JoinColumnnullable = false 也有同样的问题。

【问题讨论】:

    标签: spring jpa kotlin spring-data-jpa data-class


    【解决方案1】:

    考虑一个简单的实体,例如 Room,它与 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

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

    这同样适用于@JoinColumn

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多