grails 无法插入数据
这篇文章是有关如何在Grails中使用数据库视图的快速说明。
作为介绍,我试图总结什么是数据库视图。 但是,我注意到我无法比在Wikipedia上更好地描述它。 因此,我只在这里引用View(SQL)的维基百科摘要:
按照数据库理论,视图是对数据的存储查询的结果集,数据库用户可以像在持久数据库集合对象中一样查询该视图。 这个预先建立的查询命令保存在数据库字典中。 与关系数据库中的普通基本表不同,视图不构成物理模式的一部分:作为结果集,它是根据数据库中的数据计算或整理而成的虚拟表,当请求访问该视图时,该表是动态的。 应用于相关基础表中数据的更改将反映在视图的后续调用中显示的数据中。
(维基百科)
例
假设我们有一个具有以下域类的Grails应用程序:
class User {
String name
Address address
...
}
class Address {
String country
...
}
无论出于何种原因,我们都需要一个包含对用户名称和国家/地区的直接引用的域类。 但是,我们不想在另一个数据库表中重复这两个值。 视图可以在这里为我们提供帮助。
创建视图
至此,我假设您已经在使用Grails 数据库迁移插件。 如果您不这样做,则应该清楚地检查一下。 该插件自动包含在较新的Grails版本中,并提供了使用变更集管理数据库的便捷方法。
要创建视图,我们只需要创建一个新的变更集:
changeSet(author: '..', id: '..') {
createView("""
SELECT u.id, u.name, a.country
FROM user u
JOIN address a on u.address_id = a.id
""", viewName: 'user_with_country')
}
在这里,我们创建一个名为user_with_country的视图,其中包含三个值:用户ID,用户名和国家。
创建域类
像普通表一样,视图可以映射到域类。 我们视图的域类看起来非常简单:
class UserWithCountry {
String name
String country
static mapping = {
table 'user_with_country'
version false
}
}
请注意,我们通过将version设置为false来禁用版本控制(我们的视图中没有version列)。
此时,我们只需要确保在hibernate尝试在应用程序启动时创建/更新表之前执行数据库更改集即可。 这通常是通过在DataSource.groovy中禁用Hibernate表创建并通过将grails.plugin.databasemigration.updateOnStart设置为来启用应用程序启动时的自动迁移来完成的。
真正。 或者,可以通过运行dbm-update命令手动执行所有新的变更集来实现。
用法
现在我们可以使用我们的UserWithCountry类访问视图:
Address johnsAddress = new Address(country: 'england')
User john = new User(name: 'john', address: johnsAddress)
john.save(failOnError: true)
assert UserWithCountry.count() == 1
UserWithCountry johnFromEngland = UserWithCountry.get(john.id)
assert johnFromEngland.name == 'john'
assert johnFromEngland.country == 'england'
意见的优势
我知道我在这里使用的示例不是最好的。 用户和地址之间的关系已经非常简单,这里不需要视图。 但是,如果您拥有更复杂的数据结构,则视图可能是隐藏复杂关系的好方法,而复杂关系则需要连接很多表。 如果您不想将表的所有列公开给应用程序,则视图也可以用作安全措施。
翻译自: https://www.javacodegeeks.com/2014/01/using-database-views-in-grails.html
grails 无法插入数据