GRAILS 对象关系映射(GORM)

来源:互联网 发布:音乐软件最好 编辑:程序博客网 时间:2024/05/28 23:11

域类是任何业务应用的核心。他们保持有关的业务流程状态和实现行为。他们是通过关系连在一起的,一对一,一对多,多对多。

GORM是Grails对象关系映射(ORM)的实现。在底层,它使用Hibernate3(一个非常受欢迎的和灵活的开源ORM解决方案),感谢GORM的静态和动态类型的Groovy特性,加上Grails的约定,创建Grails领域类的配置也远远低于其他框架。

您也可以在Java中编写Grails域类。请参阅Hibernate的集成,在Java中写域类,仍然要使用动态持久方法。下面是GORM在action中的一个预览:

def book =Book.findByTitle("Groovyin Action")

book

  .addToAuthors(name:"Dierk Koenig")

  .addToAuthors(name:"Guillaume LaForge")

  .save()

快速入门指南

通过create-domain-class命令可以创建域类:

grailscreate-domain-class helloworld.Person

!!!如果未指定程序包创建域类脚本,Grails自动使用该应用程序的名称作为包名。

这将在grails-app/domain/helloworld/Person.groovy位置创建一个类:

package helloworld

class Person {

}

如果你在数据源配置中将dbCreate属性设置为“update”,“create”或“create-drop”,Grails将自动生成或修改你的数据库表。

您可以在生成的类中添加自定义的属性:

class Person {

    String name

    Integer age

    Date lastVisit

}

一旦你有一个域类,可以尝试用shell或console上输入:

grails console

加载一个交互式的图形用户界面,在这里你可以运行Groovy命令访问到Spring的ApplicationContext,GORM等。

基本的CRUD

尝试执行一些基本的CRUD(创建/读取/更新/删除)操作。

创建

要创建一个域类对象,使用Map的构造函数设置其属性值并保存:

def p = new Person(name:"Fred", age: 40, lastVisit:new Date())

p.save()

save方法将坚持你的类使用底层的HibernateORM层到数据库。

阅读

Grails增加了一个隐含的id属性,您可以使用您的域类检索:

def p =Person.get(1)

assert 1 == p.id

使用GET方法,从数据库中读取Person对象返回一个数据库标识符。您也可以使用的read方法载入只读状态中的对象:

def p =Person.read(1)

在这种情况下,底层的Hibernate引擎对不会做任何脏检查的对象不会保留。请注意,如果你明确地调用保存方法,需要将对象放置到读写状态。

此外,您还可以通过使用负载方法加载一个代理实例:

def p =Person.load(1)

这不会招致该数据库访问的方法之前其他的getId()被调用。它会初始化Hibernate的代理实例,如果没有找到记录指定的ID,抛出一个异常,。

更新

要更新的一个实例,改变一些属性,然后再次调用save:

def p =Person.get(1)

p.name = "Bob"

p.save()

删除

使用delete方法删除实例:

def p =Person.get(1)

p.delete()

 GORM中域建模

创建Grails应用程序时,你必须要考虑你正在试图解决的问题域。例如,如果你正在建立一个亚马逊风格的书店,你会思考书籍,作者,客户和出版商,仅举几例。

这些仿照GORM中的Groovy类,书类可能有一个标题,发布日期,ISBN号等。接下来的几节显示在GORM中如何模拟域。

要创建一个域类,运行时create-domain-class命令如下:

grailscreate-domain-class org.bookstore.Book

其结果将是创建一个类的基础grails-app/domain/org/bookstore/Book.groovy:

package org.bookstore

class Book {

}

这个类会自动映射到数据库中的一个表被称为book(类相同的名称)。此行为是通过ORM的领域特定语言定制

现在,你有一个域类,你可以定义其属性的Java类型。例如:

package org.bookstore

class Book {

    String title

    Date releaseDate

    String ISBN

}

每个属性映射到数据库中的一列,其中列名的惯例是全部小写,用下划线分隔。例如的RELEASEDATE映射到一列RELEASE_DATE。 SQL类型自动检测从Java类型,但可以定制约束或ORM DSL。


原创粉丝点击