使用抽象域归档域对象

时间:2013-09-23 17:48:35

标签: grails gorm

假设我在Grails 2.1.5项目中有一个现有的Domain Book。到目前为止,我一直在删除此表中的书籍。但是现在我想不要删除书籍,而是将它们归档。因此,我不必更改代码中的任何内容,我可以使用Book.get / findXX / executeQuery / ...甚至是Author.books - >所以我只找到没有存档的图书。

所以我认为使用扩展域类可能会非常好(因为Grails> 2.x)。

e.g。

class ArchivableBook {
    // some properties
    static mappings = {table 'book'}
}

class Book extends ArchivableBook {
    // ...
}

class HistoricalBook extends ArchivableBook {
    // ...
}

(也许只是让HistoricalBook扩展Book)

我知道在数据库级别,Book中会有一个列'class',用于识别它是Book还是HistoricalBook。

所以这是我的问题: 现在存档一本书的最佳方法是什么?在某种程度上,在我看来,我只需要将类列设置为新值...但到目前为止,我还没有弄清楚如何以简单的方式做到这一点。是否可以将Book转换为HistoricalBook而不是保存它?或者我是否必须删除本书并创建具有相同Id的HistoricalBook?

2 个答案:

答案 0 :(得分:3)

所以我会采用不同的方法

将“已存档”属性添加到现有类中。

class Book {
    ...
    Boolean archived
    ...
}

然后将其设置为true,而不是删除。

然后使用hibernate filters plugin过滤掉已存档的图书。

class Book {
    ...
    Boolean archived
    ...
    static hibernateFilters = {
        notArchivedFilter(condition:'archived=0', default:true)
    }
}

这将适用于所有情况,除非未通过标准请求(例如Quartz作业)或通过.get()完成查询。 .get()可以更改为.findById()

答案 1 :(得分:0)

您所指的“类”列称为鉴别器列,我不相信您可以更改它,至少不容易。我认为你会发现走这条道路会让你头疼而不是好处。

但是,您可以在src / groovy中创建一个抽象类,并从中继承两个域类。然后,您将得到两个带有公共字段的表(Book& HistoricalBook)。在Book.delete服务/控制器功能中,您可以创建HistoricalBook并放弃Book

**编辑**

src / groovy /(包名)/ArchivableBook.groovy

abstract class ArchivableBook {

    String name
    //other properties

    static constraints = {
      ...
    }

}

grails-app / domain /(包名)/Book.groovy

class Book extends ArchivableBook {
    // ...
}

grails-app / domain /(包名)/HistoricalBook.groovy

class HistoricalBook extends ArchivableBook {
    // ...
}