このアプリケーションには、ユーザー プロファイルを作成するためのdps_user
、account
、および3 つのテーブルがあります。テーブルは外部キーとして持ってprofile
います。このデザインに基づいて、書かれています。1対1のマッピングで正常に機能するin xmlとしてマッピングされます。すべてのアカウントには個別のプロファイルがあります。profile
account_id
userprofile.xml
account_id
item-type
これで、1 対多のマッピング (複数のアカウントに関連付けられた 1 つのプロファイル) のシナリオができました。profile_account
これには、以下のマッピングを持つ新しいテーブルがあります。
NEW_ID ACC_NO PROFILE_ID
====== ====== ==========
001 001 001
001 002 001
002 001 002
002 002 002
デフォルトでは、アカウント: 001 はプロファイル: 001 にマップされます。ログイン後、new_id
. この値を使用して、アカウントをフェッチし、ユーザーは UI のアカウントの 1 つになります。
ユーザーが Account: 002 with を選択した場合new_id
、プロファイルをACC_ID
: 002 で更新する必要があります。これを実現するには、最初にアカウント アイテムを取得してから、対応するプロファイル アイテムを更新します。
これを行うと、頻繁に例外が発生し、更新が失敗します。
Error : java.sql.SQLException: java.sql.SQLSyntaxErrorException: ORA-02049: timeout: distributed transaction waiting for lock
テーブルで更新が成功する場合がありますが、この更新中にprofile
古いアカウントがテーブルから削除されます。account
プロファイル テーブルの account_id の挿入、更新、削除としてカスケードがあります。
userProfile.xml:
<item-descriptor name="user" item-cache-size="3000" item-cache-timeout="900000" query-cache-size="1000" query-expire-timeout="900000">
<table name="PROFILE" type="auxiliary" id-column-name="user_id">
<property name="account" display-name="Account" column-name="ACCOUNT_ID" item-type="account" cascade="insert,update,delete" />
</table>
</item-descriptor>
<item-descriptor name="account">
<table name="ACCOUNT" type="primary" id-column-names="ID">
<property name="accountNo" data-type="string" column-name="ACC_NO" />
</table>
</item-descriptor>