Друзья, у меня есть вопрос, как организовать и аннотировать мои сущности и конфигурацию данных весны для разных отношений?
У меня есть объекты User, Wallet и Balance с отношениями:
И я хотел бы иметь следующую схему внутри mongodb:
> db.users.findOne() { _id : ObjectID('UUUU'), name : 'Jason Statham' } > db.wallets.findOne() { _id : ObjectID('WWWW'), user : ObjectID('UUUU') balances : [ { currency: 'USD', balance: 100}, { currency: 'EUR', balance: 530.50 } ] }
Объекты:
data class User(val id: String, val name: String) data class Wallet(val id: String, val user: User, val balances: List<Balance>) data class Balance(val currency: String, val balance: BigDecimal)
Мой стек:
Мои ожидания:
Wallet
UserId
объявления UserId
: fun getWalletByUserId(userId : String): Mono<Wallet>
в ReactiveMongoRepository
Id
автоматически присваивается при сохранении объектов Wallet
будет содержать ссылку ObjectID
для User
Wallet
будет содержать встроенную коллекцию Balance
Наконец я нашел решение. Вот мои классы данных:
@Document data class User( @Indexed val name: String, @Id val id: String? = null ) @Document data class Wallet( @DBRef val user: User, val balances: List<Balance>, @Id val id: String? = null ) data class Balance(val currency: String, val balance: BigDecimal)
Аннотации @DBRef
сохраняют ссылку на ObjectId
в коллекции пользователей. Вот пример объекта « Wallet
в базе данных Mongo:
> db.wallet.findOne() { "_id" : ObjectId("5a48cd1898318630f692508a"), "user" : DBRef("user", ObjectId("5a48cd1898318630f6925089")), "balances" : [ { "currency" : "USD", "balance" : "100" }, { "currency" : "EUR", "balance" : "200" } ], "_class" : "com.example.model.Wallet" }