Исторически я делал свой доступ к данным в Котлине вручную и имел определенную структуру данных, которую я всегда использовал:
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 @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, чтобы я мог правильно настроить такой тип работы?
ура