假设我在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?
答案 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.groovyabstract 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 {
// ...
}