2

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()); のようなものを作成することによってのみそれを行うことが可能ですか? ?

ありがとう!

4

1 に答える 1

1

struts2 は book オブジェクトを作成し、それにフォームの値を入力します。それはすばらしい。

私は Struts2 の専門家ではありませんが、フォーム オブジェクトのライフサイクルに関するドキュメントで読んでいることから、そのようなオブジェクトはデフォルトのコンストラクターを呼び出すことによって Struts2 によって作成されます。この動作をオーバーライドする方法がない限り、適切な DataContext から Cayenne オブジェクトを提供するファクトリに置き換えます。ここで行っていることは正しいことです。フォームに添付された値オブジェクトを分離しています (およびアクション クラス) を永続オブジェクトから取得します。

Tapestry などの他のフレームワークを使用すると、フォームを Cayenne 永続オブジェクトに直接バインドできます。同様の方法で Struts2 を拡張することもできますか??

本を追加または編集するプロセスに関連するすべてのクラスは、1 つの DataContext を共有します。

関係のないアドバイス。少なくともユーザーごとに個別の DataContext が必要です (たとえば、HttpSession に配置します)。または、リクエスト間でコミットされていない状態を維持しない場合 - リクエストごとに 1 つの DataContext でさえあるかもしれません。つまり、読み取り専用でない限り、DataContext を共有しないでください。そうしないと、アプリはスレッドセーフではありません。

于 2012-06-11T08:05:59.807 に答える