Является ли необязательный параметр @ ManyToOne автоматически установленным с помощью Nullability Kotlin - PullRequest
0 голосов
/ 17 января 2019

Я прочитал, что указание 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 не имеет значения nullable, и, таким образом, отношение следует понимать как optional=false, даже не указывая его, как я. Это тот случай?

Кстати, тот же вопрос касается @JoinColumn nullable = false.

1 Ответ

0 голосов
/ 17 января 2019

Рассмотрим простую сущность, такую ​​как 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 без House вызовет исключение, если свойство дома не обнуляется (House вместо House?), даже если значение optional равно true.

То же самое относится к @JoinColumn.

Является ли необязательный параметр @ ManyToOne автоматически установленным с помощью Kotlin допустимость пустой

Нет, это не так. Он не зависит от этого и по умолчанию установлен на true.

Вывод: Чтобы ваша схема отражала ваши сущности, рекомендуется использовать optional = true, если свойство дома будет обнуляемым, и optional = false, если свойство дома не обнуляемым .

...