【发布时间】:2016-09-27 07:58:09
【问题描述】:
我知道在将 Wicket 与 JPA 框架一起使用时,不建议序列化已经持久化到数据库的实体(因为惰性字段存在问题并节省空间)。在这种情况下,我们应该使用 LoadableDetachableModel。但是下面的用例呢?
假设我们要创建一个新实体(例如,合同),其中包括持久实体(例如,从存储在数据库中的客户端列表中选择的客户端)。正在创建的实体是某个 Wicket 组件(例如,向导)的模型对象。最后(当我们完成向导时)我们将新实体保存到数据库中。所以我的问题是:这种模型对象的序列化问题的最佳通用解决方案是什么?我们不能使用 LDM,因为实体还没有在数据库中,但我们不希望我们的内部实体(如客户端)也被完全序列化。
我的想法是实现一个自定义检票口序列化程序,以检查对象是否为实体以及它是否被持久化。如果是,则仅存储其 id,否则使用默认序列化。同样,反序列化时使用存储的 id 并从数据库中获取实体或使用默认机制进行反序列化。但是,不确定如何以通用方式做到这一点。我的下一个想法是,如果我们能做到,那么我们就不再需要任何 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) 整个合约将与内部客户端一起序列化(并且它可能很大),而且如果我们在反序列化后访问 contract.client.group 我们会遇到问题:https://en.wikibooks.org/wiki/Java_Persistence/Relationships#Serialization.2C_and_Detaching
所以我想知道人们是如何解决这些问题的,我敢肯定这是一个相当普遍的问题。
【问题讨论】:
-
几乎一样的问题(观点不同)stackoverflow.com/questions/7070644/…-
标签: java jpa serialization wicket