0

価格レート、数量、合計とともにいくつかのカテゴリの情報で構成される請求ページがあります

請求画面はこんな感じ

顧客名 : Dummy Customer 顧客の場所 : Dummy Place

カテゴリ名 数量 価格 合計 TestCategory 10 10 100 TestCategory1 15 10 150

                                         Total 250

新しいカテゴリを追加 OK 更新 削除

画面には「OK」「更新」「削除」の3つのボタンがあります。

ユーザーが [OK] ボタンをクリックすると、情報が新しい tranx としてデータベースに保存されます。

Tranxモデルは次のようなものです

Master_Tranx TranxID Tranx_Totalで構成されるエンティティ 顧客名 顧客の場所

次に 、SerialNumber/category/Quantity/Price/Tranx_id で構成されるTranxエンティティ

Master_Tranx エンティティと Tranx エンティティの関係は次のようになります

Master_Traxn の主キーは、Tranx エンティティの外部キーである tranx_id に接続された Tranx_id です。

したがって、ユーザーが [OK] を押すと、Tranx および Master_Tranx エンティティで新しいレコードが生成されます

新しい請求書ごとに、複数の行が Tranx テーブルに入りますが、単一の行が Master_Tranx エンティティに挿入されます。

今問題はアップデートにあります。

OKボタンを押すと、上記の2つのエンティティにデータが正常に作成されますが、

ユーザーが、既存の traxn にいくつかのカテゴリを追加したり、課金テーブルの既存の行の数量を更新したりするなど、既存の tranx のいずれかを更新したいとします。ユーザーは、必要なものを画面に更新した後、更新ボタンを押す必要があります。

この更新ボタンにコードを実装した方法は次のようになります

update を行う必要がある tranx_id を取得します。次に、請求画面のすべての行を取得します。次に、Tranx エンティティで構成される Master_Tranx エンティティにデータを入力し、この tranx エンティティはすべての課金テーブル行で構成されます。

次に、エンティティ マネージャーの merge() 関数を使用して更新を行います。

問題は、既存の tranx infomration を更新するのではなく、更新ボタンを押したときです。この tranx ID に対して新しい行を追加します

例:新しい情報を作成したい。次のような新しい行を追加します

カテゴリ名 数量 価格 合計 TestCategory 10 10 100 TestCategory1 15 10 150

次にOKボタンを押すと、tranx IDが生成されます

ここで、次のように既存の tranxID にもう 1 つ tranx を追加します。

カテゴリ名 数量 価格 合計 TestCategory 20 10 200 TestCategory1 15 10 150 TestCategory3 20 15 300

また、1行目の数量を10から20に変更し、更新ボタンを押します

TranxEntity に対する DB では、次のような行が表示されました

1 TestCategory 10 10 100 2 TestCategory1 15 10 150 3 TestCategory 20 10 200 4 TestCategory1 15 10 150 5 TestCategory3 20 15 300

それは次のようなものでなければなりませんが

1 TestCategory 20 10 200 2 TestCategory1 15 10 150 3 TestCategory3 20 15 300

誰でもこれを達成する方法を教えてもらえますか

4

1 に答える 1

0
  • まず、「OK」操作の一環として、 と を介して新しいエンティティを作成し、 を介しnew MasterTranx()new Tranx()それらを永続化しentityManager.persist()ます。あなたはすでにこれを行っています。
  • 次に、「更新」を実行したくない場合は、新しいエンティティを二度と作成しないでください。してはいけないこと:new MasterTranx()またはnew Tranx().
  • 代わりに、「OK」からアプリケーション メモリ内の同じエンティティ インスタンスを再利用します。または、entityManager.find() または entityManager.createQuery() を使用して、DB から同じエンティティを再度取得します。
  • エンティティが切り離されても問題ありません (たとえば、em.detach(ent) または em.clear() を介して、またはトランザクション スコープの entityManager のトランザクションの終わりを介して、またはネットワーク経由でシリアル化されたオブジェクトを渡すことによって)。
  • ユーザー インターフェイス コードは、取得した (および場合によっては切り離された) エンティティにデータを設定する必要があります。
  • それから電話する

    MasterTranx masterTranx2 = em.merge(masterTranx);

           // masterTranx could be detached
           // masterTranx2 is not detached - it is guaranteed to be managed.
    

    トランクス tranx2 = em.merge(tranx);

    • 更新されたデータが自動的に DB にフラッシュされるように、エンティティ マネージャー (または EJB) トランザクションを開始してコミットするようにしてください。

終わり。= :-)

于 2012-10-15T03:21:59.183 に答える