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 – Сохранение записей"