GORM没有保留对象的更改

时间:2018-07-04 07:28:29

标签: grails sql-update gorm

我有一个服务类,负责管理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时,从此方法返回的对象已正确设置了deletedAtdeletedBy,但是没有执行更新查询,最终没有记录,当然,不会在数据库中更新。

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类本身中添加了这两个属性的定义(覆盖它们),一切都会开始工作... 真是出乎意料。为什么会发生?

1 个答案:

答案 0 :(得分:0)

我在项目中遇到了完全相同的问题。

我不知道为什么,但是似乎您必须告诉系统使用Hibernate脏检查对象的方式,即查看其是否已更改。

休眠: hibernateDirtyChecking:是

添加此内容有助于我解决问题。 尽管我仍在努力弄清GORM的脏检查为什么不起作用。