Hibernate: обновление ассоциированного объекта - PullRequest
0 голосов
/ 18 января 2012

С этими технологиями связан следующий вопрос:

  • Hibernate 4 или 3
  • Пружина 3.1
  • Jackson
  • Ext JS 4

Предположим, у меня есть две таблицы, скажем, родительская и дочерняя.

Родительский класс выглядит следующим образом:

class Parent {
    private int id;
    private String name;

    //getter and setter methods
}

Дочерний класс выглядит следующим образом:

class Child {
    private int id;
    private String name;

    @ManyToOne // uni-directional many-to-one association to Parent
    @JoinColumn(name = "parent_id")
    private Parent parent;

    //getter and setter methods
}

Теперь в базе данных уже есть данные:

Таблица: родительская

 id   name
===================
 1    parent one
 2    parent two

Таблица: ребенок

 id   name         parent_id
=============================
 1    child one    2

Вопрос : Могу ли я обновить родителя «child one» с «parent two» на «parent one» используя эти объекты:

Parent newParent = new Parent();
newParent.setId(1);

Child child = new Child();
child.setId(1);
child.setParent(newParent);

session.saveOrUpdate(child);

Для получения дополнительной информации , дочерний объект автоматически сопоставляется Spring MVC + Джексон из JSON, который отправляется из браузера ExtJS.

Формат JSON выглядит следующим образом:

{id: 1, name: "child one", parent: {id: 1, name: "parent one"}}

Итак, дочерние и newParent объекты выше фактически созданы и установлены неявно Spring MVC + Jackson.

Таким образом, фактический код внутри контроллера Spring MVC выглядит следующим образом:

@RequestMapping(value = "child/update", method = RequestMethod.POST)
@ResponseBody
public Map<String, ?> update(@RequestBody Child child) {

    // validation for child object

    session.saveOrUpdate(child)

    // prepare response
}

Здесь также важно , JSON, отправленный из браузера, может содержать имя нового родителя

... parent: {id: 1, name: "parent one"} ...

Хотя это свойство "name" может также отображаться Spring, оно должно быть опущено Hibernate, потому что я просто хочу обновить запись "child one", а не обновить имя (записи "parent one"). *

Я знаю, что это легко сделать с помощью HQL. Но поскольку браузер отправляет JSON, а Spring может автоматически сопоставить JSON с объектом, будет проще использовать session.saveOrUpdate () вместо HQL.

Есть предложения, как все это сделать?

Большое спасибо.

1 Ответ

2 голосов
/ 19 января 2012

Можно ли с помощью этих объектов обновить родительский элемент "child one" с "parent two" на "parent one"?

Краткий ответ: да.

Браузер отправляет JSON на сервер; Spring получает запрос и отображает его на update(); Spring проверяет заголовок Content-Type и определяет, что тело ответа содержит application/json; Spring проверяет в messageConverters, есть ли у вас конвертер, который может обрабатывать JSON; Spring находит Джексона и преобразует JSON в ваш Child объект; этот объект передается в update(), где вы можете выполнять над ним операции, например, сохраняя его в режиме гибернации через saveOrUpdate().

До тех пор, пока поле parent является собственной стороной отношений (и это из модели, которую вы указали), отношения между "ребенком один" и его родителями будут обновляться. Имя, предоставленное для родителя , может быть зафиксировано; это зависит от ваших правил каскадирования.

Внутри происходит то, что Джексон создает новые объекты Parent и Child, а hibernate находит существующие сущности на основе идентификаторов; родительский идентификатор уже существует, поэтому saveOrUpdate() выбирает обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...