我知道,当使用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 - –