我知道,當使用Wicket和JPA框架時,不建議序列化已經持久化到數據庫的實體(因爲懶惰字段的問題並節省空間) 。在這種情況下,我們應該使用LoadableDetachableModel。但是下面的用例呢?Wicket - 持久化和非持久JPA實體的序列化
假設我們要創建一個新的實體(比如合同),它將包含持久化實體(比如說,從存儲在數據庫中的客戶端列表中選擇的客戶端)等等。正在創建的實體是某個Wicket組件的模型對象(例如,嚮導)。最後(當我們完成我們的嚮導時),我們將新實體保存到數據庫。所以我的問題是:這種模型對象的序列化問題最好的通用解決方案是什麼?我們不能使用LDM,因爲實體不在數據庫中,但我們不希望我們的內部實體(如客戶端)也被完全序列化。
我的想法是實現一個自定義檢票序列化程序,該程序檢查對象是否爲實體並且是否持久。如果是這樣,只存儲它的id,否則使用默認序列化。同樣,反序列化時使用存儲的id並從DB獲取實體或使用默認機制反序列化。但是,不確定如何以通用的方式做到這一點。我的下一個想法是,如果我們能做到這一點,那麼我們不再需要任何LDM,我們可以將所有實體存儲在簡單的org.apache.wicket.model.Model模型中,並且我們的序列化邏輯將會照顧它們,對?
下面是一些代碼:
@Entity
Client {
String clientName;
@ManyToOne(fetch = FetchType.LAZY)
ClientGroup group;
}
@Entity
Contract {
Date date;
@ManyToOne(fetch = FetchType.LAZY)
Client client;
}
ContractWizard extends Wizard {
ContractWizard(String markupId, IModel<Contract> model) {
super(markupId);
setDefaultModel(model);
}
}
Contract contract = DAO.createEntity(Contract.class);
ContractWizard wizard = new ContractWizard("wizard", ?);
如何通過合同?如果我們只是說Model.of(合同),整個合同將與內部客戶端一起序列化(並且它可能很大),而且如果我們在反序列化後訪問contract.client.group,我們可能碰到問題:https://en.wikibooks.org/wiki/Java_Persistence/Relationships#Serialization.2C_and_Detaching
所以我想知道人們如何解決這些問題,我相信這是一個相當普遍的問題。
幾乎相同的問題(不同的觀點)https://stackoverflow.com/questions/7070644/how-do-i-keep-entities-or-their-associations-attached-to-the-current-persisten - –