Я работаю над веб-приложением на основе Wicket в Java EE.
Я пытаюсь найти способ гарантировать, что любые объекты, используемые в качестве объектов модели, всегда присоединяются к текущему EntityManager до того, как Wicket пытаетсяоказывать любые компоненты.Таким образом, когда компоненты извлекают данные из своей модели, данные могут быть лениво загружены сущностью по мере необходимости.
Существует множество учебных пособий и несколько публикаций, ссылающихся на LoadableDetachableModels (LDM).) как решение.Это сработало для нас, когда нам не нужно сохранять состояние между запросами.В этих случаях при каждом отображении страницы LDM будет загружать из базы данных самую последнюю версию требуемого объекта.
Однако бывают случаи, когда пользователю необходимо отредактировать данные в форме с сохранением состояния с помощью несколькихна несколько шагов, прежде чем она сохранит данные, поэтому модели необходимо сохранить объект в его «несохраненном» состоянии.LDM будет эффективно уничтожать изменения пользователя на каждом шаге.
До сих пор мы использовали модель, которая при необходимости объединяет сущность с постоянным контекстом.Вот упрощенная версия:
public final class DetachableMergingModel<E extends Identifiable> implements IModel<E> {
private E entity;
private boolean attached = false;
public DetachableMergingModel(E entity) {
this.entity = entity;
}
@Override
public E getObject() {
if (!attached) {
attached = true;
// Non-transactional method merges entity with persistence context
// but does not flush any data to database
entity = getRepository().merge(entity);
}
}
return entity;
}
@Override
public void setObject(E entity) {
this.entity = entity;
}
@Override
public void detach() {
// This ensures that the next call to getObject() will merge the entity with
// the persistence context
attached = false;
}
/* ... */
}
Наш EntityManager внедряется GlassFish и охватывает весь запрос сервлета, поэтому, когда сущность присоединяется к контексту постоянства, она остается присоединенной до тех пор, пока страница не будетрендеринг.
Эта модель, описанная выше, учитывает ситуации, когда сущность уже сохраняется и только редактируетсяВсякий раз, когда компонент на странице вызывает getObject () в этой модели, Модель объединяет сущность с контекстом постоянства, и мы можем свободно перемещаться по всему графу объектов сущности, не выбрасывая исключений LazyInitializationExceptions.
Однаков ситуации, когда сущность является новой и не была сохранена, мы не можем использовать эту модель, потому что сущность еще не готова к объединению.Это часто имеет место, когда пользователь создает новый объект, и ему все еще нужно заполнить его значениями через форму.В этом случае нам нужна такая же свобода навигации по графу объектов сущности (поскольку некоторые ассоциации уже были установлены, например, родительский объект сущности), не опасаясь исключения LazyInitializationException.
Аналогичное решениеописан здесь (вариант # 3), но он не охватывает описанный выше вариант использования «новой сущности».
Кто-нибудь сталкивался с этим примером использования?Как ты это решил?Есть ли лучший способ интеграции Wicket с JPA, чем с помощью пользовательских реализаций IModel?