Grails / Gorm:如何在不影响数据库的情况下过滤域对象列表

时间:2015-03-20 13:20:53

标签: grails gorm

假设我们有类似标准的Book域对象和bookCategory对象。在我的控制器中,我想将一系列书籍的子集返回到视图中。使用查找查询无法实现该子集。当我尝试归档返回对象时,它会从数据库中删除关系!

我试过了:

class BookCategory{
     String name
     static hasMany = [books:Book]
}

class Book{
    String title
}

def myController() {
    def categories
    categories = BookCategory.list()
    def user = getCurrentUser()

    categories.each { category ->
         category.books.removeAll { book ->
             !isBookBannedForThisUser(book.title, user)
        }
    [bookCategories: categories]
    }
}

问题是它会从数据库中为所有用户的类别永久删除这些书籍!!!

我尝试将该方法放入服务并使用只读事务,但这没有帮助。

我认为即使我将所有类别和书籍复制到新列表中,他们仍然会更新数据库,因为他们仍然会有书籍ID(我需要)

当你不说save()时保存到数据库是非常危险的。有没有办法完全禁用此功能?

1 个答案:

答案 0 :(得分:2)

您的方法存在根本缺陷。 如果您不打算继续更改,请不要修改您的域实例。这样做会让您头疼。

您的域模型应该是您的记录系统。对它的任何更改都被认为是持久的。

如果您需要收集数据并对其进行操作而不将其反映在您的域模型中,请使用DTO(数据传输对象)或类似模式。

简单地调用.discard()会丢弃您在会话自动刷新时所持有的更改。

不要反对框架和禁用行为,而是改变你的方法是正确的。