Я знаю, что при использовании Wicket с фреймворками JPA нецелесообразно сериализовать объекты, которые уже были сохранены в базе данных (из-за проблем с ленивыми полями и экономии места) , В таких случаях мы должны использовать LoadableDetachableModel. Но как насчет следующего прецедента?Wicket - Сериализация сохраняемых и не сохраняемых объектов JPA
Предположим, мы хотим создать новую сущность (скажем, контракт), которая будет состоять, среди прочего, из постоянных объектов (например, Клиент, который выбран из списка клиентов, хранящихся в БД). Сущность при создании является модельным объектом некоторого компонента Wicket (скажем, Wizard). В конце (когда мы закончим наш мастер) мы сохраним новый объект в БД. Поэтому мой вопрос: каково наилучшее общее решение проблемы сериализации таких объектов модели? Мы не можем использовать LDM, потому что сущность еще не находится в БД, но мы не хотим, чтобы наши внутренние объекты (например, Клиент) тоже были сериализованы.
Моя идея состояла в том, чтобы реализовать пользовательский калибровочный сериализатор, который проверяет, является ли объект сущностью, и если он сохраняется. Если это так, сохраните только его идентификатор, иначе используйте сериализацию по умолчанию. Аналогичным образом, при десериализации использовать сохраненный идентификатор и получать объект из БД или десериализовать с использованием механизма по умолчанию. Не уверен, однако, как это сделать в общем виде. Моя следующая мысль заключалась в том, что если мы сможем это сделать, нам больше не нужен 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-peristen - –