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