Я довольно новичок в технологии Spring Data JPA и в настоящее время сталкиваюсь с одной задачей, с которой не могу справиться. Я ищу наилучшую практику для таких случаев.
В моей базе данных Postgres есть две таблицы, связанные с отношением один ко многим. Таблица «account» имеет поле «type_id», которое является ссылкой внешнего ключа на поле «id» таблицы «account_type»:
Таким образом, таблица «account_type» воспроизводит только роль словаря. В соответствии с этим я создал для сущностей JPA (Kotlin код):
@Entity
class Account(
@Id @GeneratedValue var id: Long? = null,
var amount: Int,
@ManyToOne var accountType: AccountType
)
@Entity
class AccountType(
@Id @GeneratedValue var id: Long? = null,
var type: String
)
В моем приложении Spring Boot я хотел бы иметь RestConroller, который будет отвечать за выдачу всех учетных записей в JSON формат. Для этого я сделал сериализуемые классы сущностей и написал простой restcontroller:
@GetMapping("/getAllAccounts", produces = [APPLICATION_JSON_VALUE])
fun getAccountsData(): String {
val accountsList = accountRepository.findAll().toMutableList()
return json.stringify(Account.serializer().list, accountsList)
}
, где accountRepository - это просто интерфейс, который расширяет CrudRepository<Account, Long>
.
А теперь, если я go до :8080/getAllAccounts
, я получу Json следующего формата (извините за форматирование):
[
{"id":1,
"amount":0,
"accountType":{
"id":1,
"type":"DBT"
}
},
{"id":2,
"amount":0,
"accountType":{
"id":2,
"type":"CRD"
}
}
]
Но то, что я действительно хочу от этого контроллера, это просто
[
{"id":1,
"amount":0,
"type":"DBT"
},
{"id":2,
"amount":0,
"type":"CRD"
}
]
Of Конечно, я могу создать новый сериализуемый класс для учетных записей, который будет иметь поле String вместо поля AccountType и может сопоставить класс учетной записи JPA с этим классом, извлекая строку типа учетной записи из поля AccountType. Но для меня это выглядит ненужными накладными расходами, и я считаю, что для таких случаев могла бы быть лучшая схема.
Например, у меня в голове есть то, что, возможно, каким-то образом я могу создать один класс сущностей JPA (с полем String, представляющим тип учетной записи), который будет основан на двух таблицах базы данных, и ненужная сложность наличия внутреннего объекта будет сокращается автоматически каждый раз, когда я вызываю методы репозитория :) Более того, я смогу использовать этот класс сущностей в своих бизнес-логи c без каких-либо дополнительных «оболочек».
Ps Я читал аннотацию @SecondaryTable, но она выглядит как, например, он может работать только в тех случаях, когда между двумя таблицами существует взаимно-однозначное отношение, что не в моем случае.