我有两张表,如:
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。有没有正确的方法来实现这个目标?
答案 0 :(得分:0)
我有一个很好的解决方案来跟踪交易ID。我不需要在应用程序级别跟踪事务ID。我正在使用,更新/删除触发器,以便在我的表更新时存储与审计相关的信息。 Oracle触发那些在单个事务中执行的事件,它们也在同一事务下执行。我可以在触发器中使用“ dbms_transaction.local_transaction_id ”来获取事务ID,并在记录其他审计相关信息时记录此事件。
答案 1 :(得分:0)
不确定我的回答是否有帮助,但这看起来有点像JPA的乐观锁定版本,除了默认情况下每个实体都有自己的增加版本。如果JPA实现可以某种方式配置为使用事务id作为乐观锁定版本,那么问题可能会得到解决。