Spring JPA no puede asignar un campo con un setter personalizado en una class de datos de Kotlin

Tengo una class de datos Kotlin con un setter personalizado. El marco Spring JPA parece que no puede mapear la propiedad con el setter personalizado. Si _login el getter / setter personalizado y renombro la propiedad para login lugar de _login , todo parece funcionar bien. ¿Cómo puedo crear la propiedad en la class de datos Kotlin con un setter personalizado, para que se reconozca en el marco JPA?

User.kt

 @Entity @Table(name = "jhi_user") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) data class User ( @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") @SequenceGenerator(name = "sequenceGenerator") var id: Long? = null, @NotNull @Pattern(regexp = Constants.LOGIN_REGEX) @Size(min = 1, max = 50) @Column(name = "login", length = 50, unique = true, nullable = false) var _login: String? = null, @JsonIgnore @NotNull @Size(min = 60, max = 60) @Column(name = "password_hash",length = 60) var password: String? = null, ... @JsonIgnore @ManyToMany @JoinTable( name = "jhi_user_authority", joinColumns = arrayOf(JoinColumn(name = "user_id", referencedColumnName = "id")), inverseJoinColumns = arrayOf(JoinColumn(name = "authority_name", referencedColumnName = "name"))) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @BatchSize(size = 20) var authorities: MutableSet<Authority>? = null): AbstractAuditingEntity(), Serializable { //Lowercase the login before saving it in database var login: String? get() = _login set(value) { _login = StringUtils.lowerCase(value, Locale.ENGLISH) } } 

El error que estoy recibiendo:

 ... Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [login] on this ManagedType [com.sample.domain.AbstractAuditingEntity] at org.hibernate.metamodel.internal.AbstractManagedType.checkNotNull(AbstractManagedType.java:128) at org.hibernate.metamodel.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:113) at org.hibernate.metamodel.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:111) at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:569) at org.springframework.data.jpa.repository.query.JpaQueryCreator$PnetworkingicateBuilder.getTypedPath(JpaQueryCreator.java:377) at org.springframework.data.jpa.repository.query.JpaQueryCreator$PnetworkingicateBuilder.build(JpaQueryCreator.java:300) at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPnetworkingicate(JpaQueryCreator.java:205) at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:117) at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:54) at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:111) at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:90) at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:78) at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:135) at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:256) at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:72) at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103) 

    Usar parameters personalizados para parameters de construcción como este es un poco feo (pero desafortunadamente la única forma en que soy consciente de hacerlo).

    Para empezar, JPA va a querer registrar tanto _login como login como columnas separadas en su database ya que ninguno de ellos es @Transient. Creo que su problema surge aquí ya que marcó la propiedad _login para mapear a la columna "iniciar session" mientras que la propiedad de inicio de session no tiene anotación @Column por lo que está tratando de mapear a su valor pnetworkingeterminado de "inicio de session" que ya tiene la propiedad _login mapeado a eso.

    Por lo tanto, creo que probablemente quiera hacer que _login sea transitorio y solo persista el inicio de session (me he perdido el código irrelevante por brevedad y claridad):

     ... @Transient var _login: String? = null, ... @NotNull @Pattern(regexp = Constants.LOGIN_REGEX) @Size(min = 1, max = 50) @Column(name = "login", length = 50, unique = true, nullable = false) var login: String? get() = _login set(value) { _login = StringUtils.lowerCase(value, Locale.ENGLISH) } 

    Si esto todavía no funciona, realmente creo que es más complicado de lo que vale la pena tratar de get esta solución ligeramente hacky para usar setters personalizados en las properties de los constructores que trabajan con JPA. En su lugar, sugeriría utilizar un método @ PrePersist / @ PreUpdate para realizar la minúscula antes de savela en la database.