【发布时间】:2020-06-05 07:09:47
【问题描述】:
我对 Spring Data JPA 技术还很陌生,目前面临一项我无法处理的任务。我正在寻求此类案例的最佳实践。
在我的 Postgres 数据库中,我有两个以一对多关系连接的表。表“account”有一个字段“type_id”,它是对表“account_type”的字段“id”的外键引用:
所以'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> 的接口。
现在如果我去: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"
}
]
当然,我可以为具有 String 字段而不是 AccountType 字段的帐户创建新的可序列化类,并且可以将 JPA Account 类映射到从 AccountType 字段中提取帐户类型字符串的类。但对我来说,这看起来像是不必要的开销,我相信对于这种情况可能会有更好的模式。
例如,我脑子里想的是,我可能会以某种方式创建一个 JPA 实体类(字符串字段表示帐户类型),它将基于两个数据库表,并且每个拥有内部对象的不必要的复杂性将自动减少当我调用存储库方法时:)此外,我将能够在我的业务逻辑中使用这个实体类,而无需任何额外的“包装器”。
附:我读到了 @SecondaryTable 注释,但它看起来只能在两个表之间存在一对一关系的情况下才有效,这不是我的情况。
【问题讨论】:
-
我会为 AccountType 使用 Enum(为方便起见保存为字符串,但如果您想保留架构,您可以依赖序数,或添加 AttributeConverter)请参阅:vladmihalcea.com/…
标签: spring hibernate jpa kotlin spring-data-jpa