0

我有两张桌子,例如:

User [ UserId, FirstName, LastName, AddressId (#FK), UITransactionId ] 
Address [ AddressId, city, state, UITransactionId]

UITransactionId 是捕捉具体的事务变化。例如,我有一个添加页面,可以在其中填写用户名、姓氏和地址。如果我保存用户下面的记录将被添加到表中。

 User [ U1, Narendra, Verma , A1 , 1234 ] 
 Address [ A1, Pune, MH, 1234]

UITransactionId '1234' 可以被视为事务 id 并登录到两个表中,因为用户信息和地址被保存为一个事务。

现在,如果我更新用户名和地址:

 User [ U1, NarendraEdit, Verma , A1 , 1255] 
 Address [ A1, PuneEdit, MH, 1255]  

这一次,“1255”ID 将表示为在两个表中都使用单个事务进行了更改。

现在如果我更改唯一的地址并保存用户信息:

 User [ U1, Narendra, Verma , A1 , 1255 ] 
 Address [ A1, Pune, MHEdit, 1295]  //Only this table is updated

这次'1295'应该只进入地址表,因为我们没有更新用户信息而只有地址。

有什么方法可以生成特定于 JPA 事务的事务 ID 并设置为 JPA 父/子实体?

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class })
    public void saveUser(UserVO userVO) {
     // Setting transaction Id into User/Address Entity
     // Call dao layer to save/update entity
    }

有一种方法可以让我在进行交易时在服务中生成随机数,并在保存/更新特定实体时明确设置每个实体。但是这种方法需要在每个实体的每个地方设置 UITransactionId。有没有适当的方法来实现这一目标?

4

2 回答 2

0

不确定我的回答是否有帮助,但这看起来有点像 JPA 的乐观锁版本,除了默认情况下每个实体都有自己的版本增加。如果 JPA 实现可以以某种方式配置为使用事务 id 作为乐观锁版本,您的问题可能会得到解决。

于 2013-10-09T15:12:01.333 回答
0

我得到了跟踪交易 ID 的好解决方案。我不需要在应用程序级别跟踪事务 ID。每当我的表被更新时,我正在使用更新/删除触发器来存储与审计相关的信息。Oracle 触发器在单个事务中执行,它们也在同一事务下执行。我可以在触发器本身中使用' dbms_transaction.local_transaction_id '获取事务ID ,并在记录其他审计相关信息时记录它。

于 2013-10-01T06:13:54.420 回答