Intereting Posts
Кортинский родной эквивалент дооснащения Конфигурация «compile» in устарела, но все конфигурации – это «реализация», Путаница в Int :: class.java.isInstance () в Котлине Kotlin Cast String как String.Companion Округление Двое-двух десятичных знаков в Котлине. BigDecimal.doubleValue не существует? Как использовать `filterValues` на вложенной итерации Hashmap в Котлин? Множественное разрешение сразу не работает в android Как я могу использовать возврат вместо того, чтобы входить в Котлин? Firebase SDK в Kotlin – onChildChanged не стреляет в первого ребенка в списке Как я могу объединить одиночный <Список <Список <T >>> В список <T> с RxJava 2? Dagger2 не генерирует классы кинжалов maven-source-plugin не работает для kotlin Kotlin типа безопасный строитель DSLs, безопасность для самой внешней функции Почему Kotlin позволяет иметь два класса с одинаковым именем и пакетом в разных папках (например, main и androidTest)? Как заставить безопасных строителей Kotlin работать в Scala?

JPA, Spring Data и Kotlin – Сохранение записей

Исторически я делал свой доступ к данным в Котлине вручную и имел определенную структуру данных, которую я всегда использовал:

interface Id { val id: Int } data class Identity<ID : Id>( id: ID, version: Int ) data class Model<ID : Id, DATA>( identity: Identity<ID>, data: DATA ) 

Делая это, я могу тогда иметь DAO, которые выглядят так:

 fun getUserById(id: UserId) : Model<UserId, UserData>() fun createUser(user: UserData) : Model<UserId, UserData>() 

Это, как правило, хорошо работает, но означает, что написание и тестирование DAO более трудоемки.

Для предстоящего проекта я подумывал о том, чтобы сделать это с Spring Data JPA, поэтому я могу написать свои модели как объекты JPA, а Spring Data делает все тяжелое поднятие фактически работающих с ними.

Проблема в том, что я не могу разработать простой способ работы с данными, как указано выше. Лучшее, что я смог увидеть до сих пор, это иметь:

  • Объект хранит идентификатор как родной тип и имеет ручные геттеры для преобразования его в богатый тип
  • Методы интерфейса по умолчанию, которые принимают богатый тип и делегируют версию с нативным типом
  • Объекты Entity, которые имеют столбец с идентификатором NULL и версией, что означает, что при чтении их мне всегда нужно было пройти через нулевые проверки.

По существу, вот так: (Примечание – это не проверено)

 @Entity @Table(name = "users") data class User( @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.SEQUENCE) private val rawId: Int? = null, @Version val version: Int? = null, val name: String, val email: String, val enabled: Boolean ) { val id: UserId? get() = rawId?.let { UserId(it) } } interface UserRepository : CrudRepository<User, Int> { fun findOne(id: UserId) = findOne(id.id) } 

Первые два из них я могу справиться – это боль, но далеко от конца света. Третье из них больше беспокоит, потому что это ставит меня в ситуацию, когда я знаю, что значения никогда не могут быть нулевыми, но мне все равно нужно относиться к ним так, как если бы каждый раз я обращался к любому из них.

Есть ли способ настроить JPA и Spring Data, чтобы я мог правильно настроить такой тип работы?

ура

Solutions Collecting From Web of "JPA, Spring Data и Kotlin – Сохранение записей"