Лучший способ обновить некоторые поля отделенного объекта на В спящем режиме?

Я задавался вопросом, что лучший способ состоит в том, чтобы обновить некоторые поля отдельного объекта с помощью HB на Java. Особенно, когда объект имеет атрибуты дочерних объектов. Например (удаленные аннотации и полевое число уменьшили для сокращения шума):

public class Parent {
   int id;
   String field2;
   ...
   Child child;
}

public class Child {
   int id;
   String field3;
} 

При обновлении Родителя в веб-приложении MVC я мог призвать к родительскому экземпляру с помощью Session.get (Parent.class, 123), использовать его, чтобы заполнить форму и отобразить его. Никакой DTOs, просто отдельный родитель передается представлению и связывается с формой. Теперь, я только хочу позволить пользователю обновлять field2 атрибут родителя. Таким образом, когда пользователь отправляет форму, я получаю Родительский экземпляр с идентификатором и заполненным field2 (я думаю, что mvc платформа не имеет значения здесь, все ведет себя главным образом то же при привязке).
Теперь, какая стратегия лучшее состоит в том, чтобы выполнить обновление объекта? Я могу думать в немногих альтернативах, но я хочу услышать экспертов :) (Помните, что я не хочу освобождать отношения между родителем и дочерними экземплярами),

A) Retrive Родительский экземпляр от Сессии снова и замены вручную обновленные поля

Parent pojoParent; //binded with the data of the Form.
Parent entity = Session.get(Parent.class,pojoParent.getId());
entity.setField2(pojoParent.getField2()).          

Я использую это много. Но pojoParent, кажется, используется в качестве тайного DTO. Также это становится ужасным, если количество полей для обновления становится больше.

B) Сохраните Ребенка где-нибудь (httpSession?) и партнер это последний.

Parent parent = Session.get(Parent.class,123);
//bind the retrieved parent to the form
// store the Child from parent.getChild() on the httpSession
...
//when the users submits the form...
pojoParent.setChild(someHttpSessionContext.getAttribute('Child'))
Session.save(pojoParent);

Я думаю, что это - дерьмо, но я видел его в некоторых проектах...

C) Установите отношение между Родителем и Ребенком как неизменное. Используя updatable=false на отношениях я могу обновить любое родительское поле, не волнуясь о выпуске ребенка. Так или иначе это довольно строго, и отношения никогда не будут обновляться.

Так, что Вы думаете, что лучший способ состоит в том, чтобы решить эту ситуацию?

Заранее спасибо!

11
задан Pascal Thivent 2 May 2010 в 17:06
поделиться

3 ответа

После загрузки родительского объекта вы сказали

Теперь я хочу позволить пользователю обновлять атрибут поля2 родительского уровня

на основе случая использования, вы можете использовать обновленный объект

public class UpdateableParent {

   private String field2;

   // getter's and setter's

}

сейчас Родительский репозиторий

@Repository
public class ParentRepositoryImpl implements ParentRepository {

    @Autowired
    private SessionFactory sessionFactory;


    public void updateSpecificUseCase(UpdateableParent updateableParentObject) {

        Parent parent = sessionFactory.getCurrentSession().load(Parent.class, updateableParentObject.getId());

        try {
            // jakarta commons takes care of copying Updateable Parent object to Parent object

            BeanUtils.copyProperties(parent, updateableParentObject);
        } catch (Exception e) {
            throw new IllegalStateException("Error occured when updating a Parent object", e);
        }

    }

}

Его преимущества

  • Это безопасно: вы просто обновляете то, что вы действительно хотите
  • , вам не нужно беспокоиться о Framework MVC (некоторые MVC Framework позволяет создавать свойство разрешений). Что произойдет, если вы забудете несколько допустимых полей ???

Хотя это не этот вопрос, связанный с технологией, SWEL Framework позволяет вам обновить только то, что вы хотите. Так что вам не нужно беспокоиться о том, какой шаблон использовать.

С уважением,

10
ответ дан 3 December 2019 в 08:55
поделиться

a) Получить родительский экземпляр из сеанс снова и заменить вручную Обновленные поля

Это кажется наиболее функциональной версией, которую я использовал за последние несколько лет.

b) Храните ребенка где-то (httpsessionsession?) и ассоциируйте его последний.

Я бы посоветовал против этого, особенно если вы хотите следить за парадигмом отдыха, что делает Server Side State полным нет-нет. И вы получите использование кучи пространства для отдельностей объектов, хотя пользователь, который инициировал сеанс, оставленный на кофе :)

C) Установите соотношение между родителем и Ребенок как неизменный.

ИМХО, это тоже не хороший способ, хотя оно будет подходит для небольшого проекта с небольшой моделью настойчивости. Но даже в небольшом приложении может привести к головной боли при попытке изменить код.

3
ответ дан 3 December 2019 в 08:55
поделиться

Вы можете напрямую изменять отдельный объект, а затем присоединиться к сеансу с использованием метода Merge на сеансе.

0
ответ дан 3 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: