在我们的应用程序中,我们有三个表dps_user
、account
和 ,profile
用于构建用户配置文件。该profile
表具有account_id
作为外键。基于这样的设计,userprofile.xml
编写。account_id
被映射为item-type
in xml,这对于一对一的映射工作正常。每个帐户都将有一个单独的个人资料。
现在我们有一个场景一对多映射(一个配置文件关联到多个帐户)。我们profile_account
为此有一个新表,其映射如下。
NEW_ID ACC_NO PROFILE_ID
====== ====== ==========
001 001 001
001 002 001
002 001 002
002 002 002
默认情况下,Account: 001 将映射到 Profile: 001。登录后我们将获得new_id
. 使用此值,我们将获取帐户,而用户将是 UI 中的帐户之一。
如果用户选择 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>