我有一个服务类,负责管理Project实体(现在很简单)。
@Transactional
class ProjectService {
UserService userService
...
@Publisher(ProjectEvent.PROJECT_UPDATED)
Project updateById(Long id, ProjectCommand command, Long updatedById) {
User updatedBy = userService.getById(updatedById)
Project project = getByIdAndOwner(id, updatedBy)
if (!updatedBy) {
throw new EntityNotFoundException("user was not found", User)
}
if (!project) {
throw new EntityNotFoundException("project was not found", Project)
}
project.title = command.title
project.background = command.background
project.problemStatement = command.problemStatement
project.updatedBy = updatedBy
project.lastUpdated = new Date()
project.save()
}
@Publisher(ProjectEvent.PROJECT_DELETED)
Project deleteById(Long id, Long deletedById) {
User deletedBy = userService.getById(deletedById)
Project project = getByIdAndOwner(id, deletedBy)
if (!project) {
throw new EntityNotFoundException("project was not found", Project)
}
project.deletedAt = new Date()
project.deletedBy = deletedBy
project.save()
project
}
}
一切正常,除了删除。 如您所见,我正在尝试实现对象的软删除。简而言之,它是一个更新,就像其他任何更新一样。
每当实际更改任何数据时,update方法都可以正常工作。如预期的那样,将执行更新查询(如预期的那样)。
但是,当我尝试使用deleteById
时,从此方法返回的对象已正确设置了deletedAt
和deletedBy
,但是没有执行更新查询,最终没有记录,当然,不会在数据库中更新。
project.save(flush: true)
无济于事。
我在做什么错了?
值得一提的是我的Project
类的结构。它扩展了AuditableEntity
,其中:
abstract class AuditableEntity implements Serializable {
Date dateCreated
User createdBy
Date lastUpdated
User updatedBy
Date deletedAt
User deletedBy
static constraints = {
createdBy nullable: true
updatedBy nullable: true
deletedBy nullable: true
dateCreated nullable: true
lastUpdated nullable: true
deletedAt nullable: true
}
}
所有其他Project属性都在Project类本身中定义。
更新
由于某种原因,在deleteById
方法中,在保存调用之前,project.isDirty()
返回了false
。为什么?
更新#2 另一件有趣的事情是,如果我在Project类本身中添加了这两个属性的定义(覆盖它们),一切都会开始工作... 真是出乎意料。为什么会发生?
答案 0 :(得分:0)
我在项目中遇到了完全相同的问题。
我不知道为什么,但是似乎您必须告诉系统使用Hibernate脏检查对象的方式,即查看其是否已更改。
休眠: hibernateDirtyChecking:是
添加此内容有助于我解决问题。 尽管我仍在努力弄清GORM的脏检查为什么不起作用。