代码之家  ›  专栏  ›  技术社区  ›  Joffrey

@manytoone的“可选”参数是否使用kotlin的nullability自动设置?

  •  4
  • Joffrey  · 技术社区  · 6 年前

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

    在Kotlin数据类实体中,我真的需要在注释中指定参数吗,或者可以使用 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知道 项目 字段不可为空,因此关系应理解为 optional=false 即使没有像我那样详细说明。是这样吗?

    同样的问题也适用于 @JoinColumn nullable = false 顺便说一下。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Willi Mentzel user670265    6 年前

    考虑一个简单的实体,比如 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 或者没有。

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

    同样适用于 @JoinColumn .

    是@manytoone's_156;optional_ param automatically set using kotlin's 可空性?

    不,不是。它与此无关,默认情况下设置为 .

    结论: 为了让模式反映实体,最好使用 optional = true 如果房产可以为空, optional = false 如果房产不能为空。