2015-06-17 67 views
1

我有兩個實體X和Y,關係@ManyToMany。 X有一個Y的列表,我們稱之爲yList。 X和Y都有其他班級成員(他們不重要)。反序列化json並解析JPA實體

我使用Hibernate作爲JPA提供程序,而jackson-databind/jackson-annotations用於像串行化和反序列化這樣的thinkgs。

現在,從客戶端收到以下json。它具有X的所有字段,但只有Y的列表。作爲一個具體的例子,X可以是Person,Y可以是Country。而多對多關係捕捉了哪些國家被誰訪問過。

{ 
    name: 'Bob Dylan', 
    age: '74', 
    visitedCountryIds: ['45', '23', '85'] 
} 

當反序列化JSON此,我想填充實體X的所有領域,包括yList,使得yList的元素通過在數據庫中查找這些實體解決。

到目前爲止,我的想法是通過編寫JsonDeserializer的自定義子類來反序列化yList,並讓它通過id執行查找。

這是一個合理的方法嗎?

回答

1

您可以使用@JsonCreator(正如Uri Shalit所建議的那樣),或者只是您的屬性的setter方法,您可以在其中從數據庫中進行必要的查找。但是,如果您有許多要執行此操作的實體(和關聯),則這可能是重複的樣板代碼。另外,如果直接在實體類中實現,它會用數據庫查找代碼(可讀性,SRP等)來污染它們。

如果你想對此有一些通用的方法,那麼我認爲你是一個很好的方法;定製解串器是實現它的地方。

如果我要實現通用方法,我可能會引入一個自定義註釋,我將它放在關聯定義中,並附帶標準的JPA註釋。例如:

@MyCustomJsonIds("visitedCountryIds") 
@ManyToMany(...) 
private List<Country> countries; 

然後,在解串器,我會查詢這些註釋的存在,以動態地確定需要從數據庫中查找什麼。

2

另一種選擇是創建一個接受這些參數的構造函數,使用@JsonCreator對其進行註釋,並讓構造函數執行數據庫查找,這樣您就不需要編寫特定的解串器。