Kotlin, JPA i klasy @Embeddable

0

Mam value object z @Embeddable:

const val MIN_PASSWORD_LENGTH = 5

@Embeddable
class AccountUserPassword private constructor(val text: String) {

    constructor() : this("default") 

    companion object {

        fun create(text: String, passwordEncoder: PasswordEncoder): Either<Error, AccountUserPassword> =

            if (text.length < MIN_PASSWORD_LENGTH)
                Either.left(WrongPasswordLengthError(text)) else
                    Either.right(AccountUserPassword(passwordEncoder.encode(text)))
    }
}

Pojawia się taki problem: "For property-based access both getters and setters should be present". Oczywiście ten value object musi być immutable, więc nie mogę dodać żadych setterów. W Javie działa normalnie z publicznym i finalnym polem.

0

Najwyrazniej ta adnotacja oczekuje, ze klasa musi byc mutowalna i nie ma bata ¯\_(ツ)_/¯
Zamien val na vari pewnie przejdzie.

PS:

class AccountUserPassword private constructor(val text: String = "default")

^ bo za duzo Javy w tym Twoim keczupie :)

0

@stivens: Przecież napisałem, że w Javie działa bez problemu z polem, które jest final.
A jak lepiej to zapisać?

3

Są takie gówniane pluginy do kompilatora. Zobacz: https://www.baeldung.com/kotlin/jpa

0

A jestes pewny, ze JPA (?) sobie tego nigdy samo nie wykonstruuje? Bo Ty chcesz zeby to przechodzilo przez companion object { fun create() = .... ale "Jak tak zrobię to kompilator się drze, że klasa musi mieć publiczny, bezparametrowy konstruktor." sugeruje, ze to sobie chce konstruowac obiekty przez bezargumentowy konstruktor. A wtedy nie ma zadnego szyfrowania.

EDIT: ewentualnie jak sobie wykonstruuje to jeszcze ok. Tylko zeby tam juz zaszyfrowana wartosc byla (czyli np. z bazy). Ale no wyglada jakby ten konstruktor mial byc publiczny.

0

Znalazłem rozwiązanie. Wystarczyło dodać @Column(updetable = false) obok property.

2
Sampeteq napisał(a):

Znalazłem rozwiązanie. Wystarczyło dodać @Column(updetable = false) obok property.

JPA dość kiepsko się zgrywa z immutable. TTTM (Ten typ tak ma)

btw rozdzielnie encji bazodanowych od biznesowych uwolniło by od kłopotu

1 użytkowników online, w tym zalogowanych: 0, gości: 1