Kotlin, JPA i klasy @Embeddable

Kotlin, JPA i klasy @Embeddable
SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 94
0

Mam value object z @Embeddable:

Kopiuj
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.

stivens
  • Rejestracja: dni
  • Ostatnio: dni
0

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

PS:

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

^ bo za duzo Javy w tym Twoim keczupie :)

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 94
0

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

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
3

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

stivens
  • Rejestracja: dni
  • Ostatnio: dni
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.

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 94
0

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

JM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.