假设我在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/

10-10 16:22