cayenne を使用して PostgreSQL データベースとやり取りしようとしています。これまでのところ、すべてが期待どおりに機能していましたが、よくわからない問題に悩まされています (カイエンは初めてです)。
通常のフィールド (book_id、title、editor、price) を持つテーブル「books」、著者 (author_id、author_name) の「テーブル」、リンク テーブル「books_authors」(book_id、author_id) があるとします。
本を追加または編集するプロセスに関連するすべてのクラスは、1 つの DataContext を共有します。
本を追加できる struts2 (速度テンプレートを使用) フォームがあり、ajax を使用して複数の著者が関連付けられています。特定のイベントに反応して、著者が存在するかどうかを検証する struts2 アクションを呼び出す ajax リクエストを起動し、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>
book のセッターとゲッターを持つ AddOrEditBook.do にフォームを送信すると、struts2 が book オブジェクトを作成し、フォームの値を入力します。それはすばらしい。
これは私を悩ませていることです:
本を更新するとき、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 を使用して db エンティティを更新する際の正しい戦略は何ですか? bookFromDb.setTitle(book.getTitle()); のようなものを作成することによってのみそれを行うことが可能ですか? ?
ありがとう!