Leí que especificar optional = false en la anotación de asociación @ManyToOne podría ayudar a Spring a mejorar el rendimiento de las consultas.
En una entidad de clase de datos de Kotlin, ¿realmente necesito especificar el parámetro en la anotación, o Spring puede resolver esto por sí mismo usando la nulabilidad del campo del item ?
Por ejemplo, si tengo la siguiente declaración:
@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 } En este caso, por ejemplo, esperaría que Spring supiera que el campo del item no admite valores NULL y, por lo tanto, la relación debe entenderse como optional=false , incluso sin especificarlo como lo hice yo. ¿Es este el caso?
La misma pregunta se aplica a @JoinColumn 's nullable nullable = false , por cierto.
Considere una entidad simple como Room que tiene una relación @ManyToOne con House .
@Entity class Room( @ManyToOne(optional = true) val house: House ) { @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long = 0 }JPA creará una mesa de sala con una columna.
`house_id` bigint(20) DEFAULT NULL Si especifica @ManyToOne(optional = false)
la columna se verá así:
`house_id` bigint(20) NOT NULL Al especificar opcional, le dice a JPA cómo se debe generar el esquema, si la columna puede ser NULL o no.
En el tiempo de ejecución, intentar cargar una Room sin una House provocará una excepción si la propiedad de la casa no admite valores NULL (¿ House en lugar de House? ), incluso cuando el valor de optional es true .
Lo mismo se aplica a @JoinColumn .
¿El parámetro "opcional" de @ManyToOne se configura automáticamente usando la nulabilidad de Kotlin?
No, no es. Es independiente de eso y por defecto se establece en true .
Conclusión: para que su esquema refleje sus entidades, es una buena idea usar optional = true si la propiedad de la casa sería anulable y optional = false si la propiedad de la casa no fuera anulable.