- 在所有映射之后,我分离实体 AE(仅在映射延迟子集合后分离)
假设您在单个事务中执行此操作。您从 DB 检索到的任何持久对象都与当前会话和事务上下文相关联。如果在同一个事务中被修改,它的状态会自动与数据库同步。这种机制称为automatic dirty checking
。这意味着 Hibernate 将跟踪并保存对会话内对象所做的更改。
Transaction tx = session.beginTransaction();
int addressEntityID = 1234;
AddressEntity addressEntity = (AddressEntity) session.get(AddressEntity.class, new Long(addressEntityID));
// set the values from AddressDTO to AddressEntity
tx.commit();
session.close();
从数据库中检索对象,对其进行修改并在事务提交时将修改传播到数据库。您无需分离和重新附加实体即可执行更新。
- 现在我将版本从 DTO 映射到 AE(因为休眠不允许更新托管实体中的版本)
托管版本控制用于实现乐观锁定,实体的版本控制由 Hibernate 管理。版本号只是一个计数器值,它没有任何有用的信息,你应该在你的 DTO 中保留。你不需要自己设置版本的值。Hibernate 将在您第一次保存 时初始化该值AddressEntity
,并在修改对象时递增或重置它。
如果另一个应用程序事务 (T2) 更新持久实例相同的项目,因为它被当前应用程序事务 (T1) 读取,则 T2 事务将更改此实体的版本值。现在,当 T1 尝试进行更新时,Hibernate 将抛出一个stale object state exception
,因为version
实体的 已更改。您可以捕获exception
并通知用户有关过时的数据。特别是,版本控制可以防止丢失更新问题。您不需要将版本从 DTO 映射到 AE 或从 AE 映射到 DTO,因为除了实现乐观锁定之外,它没有任何可用于上下文的有意义的信息。