- 在所有映射之后,我分离实体 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,因为除了实现乐观锁定之外,它没有任何可用于上下文的有意义的信息。