hibernate - Grails 3 Integration Test executeUpdate,表行属性未更新

标签 hibernate grails integration-testing gorm spock

我正在测试的服务方法如下所示

void updateOrderStatusToComplete(def orderIdList) {
    if (orderIdList) {
        try{
            def response = Order.executeUpdate("update Order tabrr set tabrr.status = :status where tabrr.id in (:idList)", [status: "Completed", idList: orderIdList])

        } catch(Exception e){
            throw new RuntimeException("Error updating orders to Complete")
        }
    }
}

我的测试首先创建了4个订单:
void "updateRowsToMatch" (){
    given: "we have 4 existing orders with status open"

    def order1 = new Order(description: "item 1", price: 50.00, status: "Open")
    order1.save()
    def order2 = new Order(description: "item 2", price: 60.00, status: "Open")
    order2.save
    def order3 = new Order(description: "item 3", price: 70.00, status: "Open")
    order3.save()
    def order4 = new Order(description: "item 4", price: 80.00, status: "Open")
    order4.save()

    def orderIdList = [order1.id, order2.id, order3.id, order4.id]

    when: "we use orderservice to update the rows status...."
    orderservice.updateOrderStatusToComplete(orderIdList)

    then: "the orders status should be updated to "Completed"

    assert Order.get(order1.id).status == "Completed"
    assert Order.get(order2.id).status == "Completed"        
    assert Order.get(order3.id).status == "Completed"        
    assert Order.get(order4.id).status == "Completed"
}

当我在测试之前使用表行为数据库添加种子并使用这些ID时,然后测试通过,现有行将更新。该问题似乎仅在我在测试中创建表行时出现。但是有趣的是,executeUpdate的返回值为4,这意味着实际上已经更新了4个表行,因此对于状态为何实际上并未更改,我有些困惑。
该测试使用@Integration和@Rollback
注释,这意味着在测试过程中将回退测试事务,而不是完全提交测试事务。但是我仍然可以使用Order.findById(...)或Order.findByDescription()来保存已保存的订单,因此我不确定为什么在测试过程中这种情况持续存在,但对executeUpdate事务却没有。

最佳答案

找到了解决方案。刷新似乎不起作用,但是清除 session 可以起作用,因此在测试类的开头为Hibernate SessionFactory插入了一个setter。

def sessionFactory

然后保存对象之后
sessionFactory.currentSession.clear()

这样做可以更新和检索测试中创建的对象

关于hibernate - Grails 3 Integration Test executeUpdate,表行属性未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61880675/

相关文章:

java - 无法通过 hibernate 执行触发器

java - orphanRemoval=true 双向OneToOne

image - 更新Grails数据库中的图像

具有不同结果的 Hibernate/Gorm 查询和非主键上的 JOIN

image - Grails-从 Controller 加载图像

user-interface - 用户界面测试

java - 在现有的java项目中加载hibernate.cfg.xml

java - Spring ORM 4.0.5 和 Hibernate 4.3.5 - 无法保存到数据库

unit-testing - 包含测试的应用程序示例

Python 多处理 : AttributeError: Can't pickle local object