代码之家  ›  专栏  ›  技术社区  ›  Narendra Verma

JPA/Hibernate:生成特定于事务的事务id,并设置为JPA父/子实体

  •  0
  • Narendra Verma  · 技术社区  · 12 年前

    我有两张桌子,分别是:

    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。有什么合适的方法来实现这一点吗?

    2 回复  |  直到 12 年前
        1
  •  0
  •   Narendra Verma    12 年前

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

        2
  •  0
  •   Henno Vermeulen    12 年前

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