我有一个DTO,它需要Map到DB中带有@Version列的实体,然后进行更新。
在Map之前,我从数据库中获取实体(因为需要进行一些验证和比较),然后使用Map器。因此,代码如下:
Entity fromDB = getEntity(eDto.getId());
Entity forUpdate = mapper.toEntity(fromDB, eDto);
Map器:
Entity toEntity(@MappingTarget Entity e, EntityDto eDto);
在EntityDto中,我有几个列和版本。但从数据库中获取实体后,它位于PersistenceContext中,版本无法更改,因此即使我使用了错误的版本号,我也不会收到乐观锁定失败异常。如何解决此问题有何建议?
UPDATE:(此处是一个示例)
- user 1获取UI上ID为1且版本为1的实体
- user 1对实体进行了一些更改
1.与此同时,其他用户已更改对象并将其保存到数据库(现在版本为2) - user 1使用版本1调用updateEntity,然后它进入我方法进行更新
1.我从DB中获取实体(现在版本为2)
1.我将其Map到forUpdate(但此处未Map版本,因为fromDB位于PersistenceContext中,不允许更改版本)
1.已进行更改,但不应进行更改,因为版本不相同!
1条答案
按热度按时间xzv2uavs1#
不知道这对您有多大帮助,但我认为Blaze-Persistence实体视图非常适合您的情况。
我创建这个库是为了允许在JPA模型和自定义接口或抽象类定义的模型之间进行简单的Map,就像Spring Data Projections一样。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)Map到实体模型。
使用Blaze-Persistence Entity-Views时,您的用例的DTO模型可能如下所示:
查询是将实体视图应用于查询的问题,最简单的是按id查询。
EntityDto a = entityViewManager.find(entityManager, EntityDto.class, id);
Spring Data 集成允许您像Spring Data 投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
最好的部分是,它只会获取实际需要的状态!
通过SpringWebMvc集成,您甚至可以将实体视图具体化,如下所示:
它将按照您的预期进行持久化/更新!