我需要创建一个只有一行的表
我有一个域类,例如Book
,它具有属性Year
。
class Book {
Integer year
static mapping = {
...
}
}
我需要在域类中写什么?
例如,如果您只需要一个年份为2013
的图书记录,那么您可以将约束定义为
class Book {
Integer year
static constraints = {
year inList: [2013], unique: true
}
}
unique: true
不会让您创建具有重复year
和inList
的记录,将确保您有一个且只有一个year
,即2013。对于第一次插入,这两个约束都将通过,而对于后续的插入/更新,这两个约束将失败。因此,您最终在Book
中只有一条记录,年份为2013。
不幸的是,用于完成此beforeInsert
的GORM事件不允许拒绝插入(从Grails 2.2.2开始)。beforeUpdate
可以,但在这种情况下没有帮助。
我想到了两个解决方案:
-
使用服务方法执行是否插入的决策。但是,如果另一个类直接使用域类,则不会自动拒绝插入。
-
创建一个自定义Hibernate PreInsertEventListener,检查表是否已经有数据
Burt Beckwith在2011年的gr8Conf会议中概述了使用自定义Hibernate事件侦听器来创建有效的只读域类,如果您想要后者的示例