我在 Spring-Boot (Kotlin) 專案中創建了一個物體(模型或資料類),該專案包含一個型別為 Arraylist 的欄位,但是當我從 Postman 以 JSON 格式發送陣列資料時,該陣列被存盤在資料庫中作為一個長隨機字串。
當我嘗試從資料庫中檢索資料時,我得到了完全格式化的實際陣列。
我的問題是為什么 ArrayList 像這樣存盤在 H2 資料庫中???
評估.kt
@Entity
data class Evaluation (
@Id val id : String,
val timeStamp : Long,
val symptoms : ArrayList<String>,
val travelHistory : Boolean,
val contactWithCovidPatient : Boolean,
val evaluatedBy : String,
var evaluationPercentage : String? = null,
@ManyToOne var user: User? = null
)
評估控制器.kt
@RestController
class EvaluationController (val evaluationService: IEvaluationService) {
@PostMapping("evaluate/{userId}")
fun evaluateUser(@PathVariable userId : String, @RequestBody evaluation: Evaluation) : ResponseEntity<Evaluation> =
ResponseEntity.ok().body(evaluationService.addEvaluation(evaluation, userId))
}
請求正文 JSON
{
"id":"e_01",
"timeStamp":"123456789",
"pinCode":"123457",
"travelHistory":true,
"contactWithCovidPatient":true,
"evaluatedBy":"u_01",
"symptoms": ["Fever","Cough"]
}
回應 JSON
{
"id": "e_01",
"timeStamp": 123456789,
"symptoms": [
"Fever",
"Cough"
],
"travelHistory": true,
"contactWithCovidPatient": true,
"evaluatedBy": "u_01",
"evaluationPercentage": "95",
"user": {
"id": "u_01",
"name": "abc01",
"phoneNumber": "9876543210",
"pinCode": "123457",
"covidResult": "Positive"
}
}
H2 資料庫表

uj5u.com熱心網友回復:
這是一個表示序列化ArrayList物件的十六進制字串。有關Java 中物件序列化的詳細資訊,請參閱可序列化物件。
運行以下代碼會產生相同的結果:
List<String> symptoms = new ArrayList<>(Arrays.asList("Fever", "Cough"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(symptoms);
byte[] serializedObject = byteArrayOutputStream.toByteArray();
String hex = Hex.encodeHexString(serializedObject); // Apache Commons Codec
System.out.println(hex);
aced0005737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a657870000000027704000000027400054665766572740005436f75676878
uj5u.com熱心網友回復:
在 DB 中看到的原始字串是一個序列化物件。
實作這一點的一種方法是首先將您的字串 ArrayList 加入一個分隔的字串,但我強烈建議不要這樣做。 通常,將串列放入表的單個欄位中是不好的做法。您應該做的是為與評估具有一對多關系的癥狀創建一個單獨的表。
在使用 JPA 時設計物件時需要注意非規范化。在您的情況下,請考慮以下問題:
- 如果要查詢具有特定癥狀的評估,會發生什么情況?
- 如果您想查詢所有癥狀的串列,會發生什么?
- 如果您想用一些其他細節(例如癥狀出現的日期)來擴展癥狀,會發生什么情況?
如果您曾經嘗試將某些內容的集合添加到資料庫欄位中,那么 99.9999% 的情況就是您做錯了。癥狀應該是它們自己的物體,您在評估和癥狀之間存在一對多或多對多關系,具體取決于您的需求。
編輯 :
為了進一步澄清我的答案,在設計物件類時要考慮一個欄位是值物件還是物體。值物件是無法進一步分解的東西,可以由原始型別表示,例如 Date、String、Int 等。一些示例可以是物件 ID、姓名、電話號碼等。
物體是可以進一步擴展的物件,例如您創建的評估物件。在評估中,您有一個癥狀串列,并且您將癥狀視為值物件。它是一個值物件嗎?我可以立即想到一些您可以放入 Symptom 物件的附加欄位,并且通過按照您的方式對癥狀進行非規范化,您還將大量重復資料輸入到資料庫中。
在您的實作中包含 ["Fever", "Cough"] 的評估物件將作為一個欄位輸入到資料庫中。但是另一個包含相同癥狀的評估物件將被輸入到該評估的資料庫中,因為您沒有外鍵依賴性或表示癥狀的單獨表。除了無法查詢與評估相關的癥狀,或者無法自行查詢癥狀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341278.html
