Я задавался вопросом, что лучший способ состоит в том, чтобы обновить некоторые поля отдельного объекта с помощью 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 на отношениях я могу обновить любое родительское поле, не волнуясь о выпуске ребенка. Так или иначе это довольно строго, и отношения никогда не будут обновляться.
Так, что Вы думаете, что лучший способ состоит в том, чтобы решить эту ситуацию?
Заранее спасибо!
После загрузки родительского объекта вы сказали
Теперь я хочу позволить пользователю обновлять атрибут поля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);
}
}
}
Его преимущества
Хотя это не этот вопрос, связанный с технологией, SWEL Framework позволяет вам обновить только то, что вы хотите. Так что вам не нужно беспокоиться о том, какой шаблон использовать.
С уважением,
a) Получить родительский экземпляр из сеанс снова и заменить вручную Обновленные поля
Это кажется наиболее функциональной версией, которую я использовал за последние несколько лет.
b) Храните ребенка где-то (httpsessionsession?) и ассоциируйте его последний.
Я бы посоветовал против этого, особенно если вы хотите следить за парадигмом отдыха, что делает Server Side State полным нет-нет. И вы получите использование кучи пространства для отдельностей объектов, хотя пользователь, который инициировал сеанс, оставленный на кофе :)
C) Установите соотношение между родителем и Ребенок как неизменный.
ИМХО, это тоже не хороший способ, хотя оно будет подходит для небольшого проекта с небольшой моделью настойчивости. Но даже в небольшом приложении может привести к головной боли при попытке изменить код.
Вы можете напрямую изменять отдельный объект, а затем присоединиться к сеансу с использованием метода Merge на сеансе.