假设我们有类似标准的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()时保存到数据库是非常危险的。有没有办法完全禁用此功能?
答案 0 :(得分:2)
您的方法存在根本缺陷。 如果您不打算继续更改,请不要修改您的域实例。这样做会让您头疼。
您的域模型应该是您的记录系统。对它的任何更改都被认为是持久的。
如果您需要收集数据并对其进行操作而不将其反映在您的域模型中,请使用DTO(数据传输对象)或类似模式。
简单地调用.discard()
会丢弃您在会话自动刷新时所持有的更改。
不要反对框架和禁用行为,而是改变你的方法是正确的。