Grails/Gorm: 如何在不影响数据库的情况下过滤域对象列表
Grails/Gorm: how to filter a list of domain objects without affecting the database
假设我们有标准的 Book 域对象和 bookCategory 对象。在我的控制器中,我想 return 书籍列表的子集到视图。使用查找查询无法获得该子集。当我尝试归档 return 对象时,它会从数据库中删除关系!
我试过这个:
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() 就保存到数据库是非常危险的。有没有办法完全禁用此功能?
您的方法存在根本性缺陷。 如果您不打算保留更改,请不要修改您的域实例。这样做会让您头疼。
您的域模型应该是您的记录系统。对它的任何更改都应该被保留。
如果您需要收集数据并对其进行操作而不将其反映在您的领域模型中,那么请使用 DTO(数据传输对象)或类似模式。
只需调用 .discard()
就会丢弃您所做的更改,以免在会话自动刷新时被持久化。
不要违背框架和禁用行为,而是改变您的方法以使其正确。
假设我们有标准的 Book 域对象和 bookCategory 对象。在我的控制器中,我想 return 书籍列表的子集到视图。使用查找查询无法获得该子集。当我尝试归档 return 对象时,它会从数据库中删除关系!
我试过这个:
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() 就保存到数据库是非常危险的。有没有办法完全禁用此功能?
您的方法存在根本性缺陷。 如果您不打算保留更改,请不要修改您的域实例。这样做会让您头疼。
您的域模型应该是您的记录系统。对它的任何更改都应该被保留。
如果您需要收集数据并对其进行操作而不将其反映在您的领域模型中,那么请使用 DTO(数据传输对象)或类似模式。
只需调用 .discard()
就会丢弃您所做的更改,以免在会话自动刷新时被持久化。
不要违背框架和禁用行为,而是改变您的方法以使其正确。