Я пытаюсь использовать cayenne для взаимодействия с базой данных PostgreSQL. До сих пор все работало так, как ожидалось, но теперь я столкнулся с проблемой, которую не совсем понимаю (я новичок в кайенне).
Скажем, у меня есть таблица «книги» с обычными полями (книга_id, название, редактор, цена), «таблица» авторов (автор_ид, автор_имя) и таблица ссылок «книги_авторы» (книга_ид, автор_ид).
Все классы, связанные с процессом добавления или редактирования книги, совместно используют один DataContext.
У меня есть форма struts2 (я использую шаблоны скорости), которая позволяет вам добавить книгу и, используя ajax, несколько связанных с ней авторов. Я реагирую на определенное событие, чтобы запустить запрос ajax, который вызывает действие struts2, которое проверяет, существует ли автор, а затем добавляет объект Books_Authors (класс, сгенерированный cayenne) в сеанс struts2 (действие реализует SessionAware).
Форма выглядит следующим образом:
<form action="AddOrEditBook.do">
<input type="hidden" name="book.book_id" value="$!book.book_id" />
<input type="text" name="book.title" value="$!book.title" />
<input type="text" name="book.editor" value="$!book.editor" />
<input type="number" name="book.price" value="$!book.price" />
<input type="text" name="author" /> <input type="button" name="addAuthor" value="Add" />
<ul>
<li id="author_2">Author 2 <input type="button" name="removeAuthor" value="Remove" /></li>
<li id="author_16">Author 16 <input type="button" name="removeAuthor" value="Remove" /> </li>
</ul>
<input type="submit" />
</form>
Как только я отправляю форму в AddOrEditBook.do, у которого есть сеттер и геттер для книги, struts2 создает объект книги и заполняет его значениями формы. Это мило.
Вот что меня смущает:
Когда я обновляю книгу, я не нашел способа использовать объект, созданный struts, для обновления базы данных. Чего я хочу добиться, так это каким-то образом указать cayenne использовать объект, созданный struts, для обновления соответствующего объекта в базе данных.
Я много напутал с такими вещами, как object_id, PersistenceState и т.д.:
Expression exp_book = ExpressionFactory.matchExp(Book.BOOK_ID_PROPERTY, book.getBook_id());
Book bookFromDb = RetrieveHelper.retrieveScalarByExpression(ctxt, new Book(), exp_book);
book.setObjectContext(ctxt);
book.setObjectId(bookFromDb.getObjectId());
ctxt.getObjectStore().registerNode(book.getObjectId(), book);
book.setPersistenceState(PersistenceState.MODIFIED);
Какова правильная стратегия при использовании cayenne для обновления объектов БД? Возможно ли это сделать только с помощью таких вещей, как bookFromDb.setTitle(book.getTitle()); ?
Спасибо!