Best practice for Hibernate

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.

1 Like

You can move id to the class body if you need it to be generated

@Entity
class Account(
//....
) {
   @Id @GeneratedValue
   val id = 0 // will be replaced by hibernate
}
1 Like

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) ?

That happens because you are creating classes that have members in its constructor.

Use this

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 ?

Well from your example you are creating a class with a primary constructor.

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.

Ha, I was not the original owner of this question :slight_smile:

My class looks like this :

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 :slight_smile:

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.

No It does not. You can declare them in the constructors. I really recommend to carefully read the documentation.