假设我在Grails 2.1.5项目中有一个现有的Domain Book。到目前为止,我一直在从此表中删除“书籍”。但是现在我不想物理删除“书”,而是将其存档。这样我就不必在执行Book.get / findXX / executeQuery / ...或什至Author.books->的代码中进行任何更改,从而只查找未存档的Book。
因此,我认为使用扩展域类可能会非常好(因为Grails> 2.x)。
例如
class ArchivableBook {
// some properties
static mappings = {table 'book'}
}
class Book extends ArchivableBook {
// ...
}
class HistoricalBook extends ArchivableBook {
// ...
}
(也许仅仅让HistoricalBook扩展Book就足够了)
我知道在数据库级别上,“书”中将有一个“类”列,该列将确定它是一本书还是一本HistoricalBook。
所以这是我的问题:
现在归档图书的最佳方法是什么?在我看来,我似乎只需要将class列设置为新值即可。但是到目前为止,我还没有弄清楚如何轻松地实现这一点。是否可以将Book转换为HistoricalBook并保存呢?还是我必须删除该书并创建具有相同ID的HistoricalBook?
最佳答案
所以我会采取不同的方式
在现有的类上添加一个“已归档”属性。
class Book {
...
Boolean archived
...
}
然后将其设置为true,而不是删除。
然后使用hibernate filters plugin过滤出存档的书籍。
class Book {
...
Boolean archived
...
static hibernateFilters = {
notArchivedFilter(condition:'archived=0', default:true)
}
}
这在所有情况下都适用,除非不是通过标准请求(例如,Quartz作业)完成查询,或者不是通过
.get()
完成查询。 .get()
可以更改为.findById()
。关于grails - 使用抽象域归档域对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18965644/