I’m using Kotlin with Spring and Hibernate. What’s the best practice for Hibernate models with Kotlin? Should I use immutable or mutable classes? Should I use data class? Should I use nullable property for id? Should I use constructor properties or body properties? It seems that there’s absolutely no kotlin-specific support in Hibernate and I did not find popular helper libraries.
Currently I just started and the following class seems to work:
@Entity
class Account(
@Id
val id: Int?,
var name: String,
var password: String,
@Enumerated(STRING)
var type: AccountType
)
but the drawback is that I have to use !! every time I’m accessing id. On the other hand I must use something like null to indicate that hibernate must generate id on save.
What about UUID / String IDs ?
The “lateinit” keyword does not work, since Hibernate tries to “get the ID” before saving, in order to know whether the Entity is a new one, or should be updated.
Should we keep the IDs as “nullable” ? Or can we, let’s say, initialize them with a dummy value (like an empty String) ?
I already am using the “no-arg” plugin, and the class in question does not have a constructor with members. Anyway, even if it did, why would it change the way Hibernate handles Primary Keys ?
The no-arg plugin enables the generation of no-arg constructors only for specific annotations. You should add the @Entity annotation to those using Gradle.
Otherwise use the JPA plugin that already does that out of the box.
class ConnectableUser
{
@Id
open var userId: String = ""
....
}
And I’m not sure whether I should keep “userId” as nullable (with a String?), or if I should initialize with a dummy value (like I did, with an empty String)
In this example there is no primary constructor with members (and I am using no-arg plugin)
I believe there is no need for defaults or nulls as long as the schema reflects the entity definition (at least for nulls), but try to compile and run a meaningful example! Let us know
But kotlin will always ask you to initialize the attributes, unless you use lateinit, right? Another approach would be to declare the attributes in the constructor.
I’m relativelly new in kollin lang, so still learning.