任何面向对象语言,不管是桌面,Server,Mobile 应用程序,Domain在程序中都是重要的。
Domain是任何企业应用的核心,比如在书店应用中需要Book,在购物应用中需要Order,这些企业实体相互关联着,他们的状态可以被保存,或者在以后的某个时刻被取回。
在OOP中,Object拥有属性,字段,方法。数据库中的表格拥有Columns和primary keys。如果你使用过ORM,那么对象与数据库的映射将非常的简单。
Grails是构建在Spring+Hibernate之上的,不过他提供了一种更简单的映射Grails Object-Relational
Mapping (GORM)。
Grails使用Hibernate’高度定制配置APIs,考虑更加容易使用ORM映射, 通过运用规约的力量使用新的映射战略叫Grails Object-relational Mapping (GORM)。
Domain class 可以通过命令行 create-domain-class创建:
grails create-domain-class Person
他将创建一个路径为 grails-app/domain/Person.groovy 的类:
class Person {
}
假如你在 DataSource设置了 dbCreate property 为 "update", "create" or "create-drop" , Grails w将自动产生修改你的数据表格。
你可以通过添加属性来定制你的Domain class:
class Person {
String name
Integer age
Date lastVisit
}
基本的CRUD (Create/Read/Update/Delete) 操作.
Create:设置Domain属性 然后调用 save方法保存到数据库中(利用潜在的hibernate ORM层):
def p = new Person(name:"Fred", age:40, lastVisit:new Date())
p.save()
注意Groovy中new一个对象与Java中的差别,这点,会在相应的Groovy系列教材中讲到。Read:Grails 会自动添加一个 id property 在你的 domain class ,通过id来取得对应的Domain class:
def p = Person.get(1)
assert 1 == p.id
Update:更新某个实体, 先设置其属性然后再次调用 save 方法:
def p = Person.get(1)
p.name = "Bob"
p.save()
Delete:删除实体通过 delete 方法:
def p = Person.get(1)
p.delete()
下面我们来看下怎么样设计 domain in GORM.
- 创建a domain class 你可以在命令行提示符中运行 create-domain-class (必须在项目路径下使用此命令行,谨记!!!):
grails create-domain-class Book
结果一个 class 将在你的项目路径grails-app/domain/Book.groovy下被创建:class Book {
}
注:假如你想创建packages,只需要把class移动到你相应的packages中,不过必须是在grails-app/domain下,然后按照Java的packages规则来声明packages。上面的Class被自动映射到一个名为book的数据表格中 (和class同样的名字,当然它是小写的).上面这些都是通过ORM Domain Specific Language规约产生的。 - 现在可以使用 Java类型来定义你的 properties
class Book {
String title
Date releaseDate
String ISBN
}
每个属性将被映射到 数据库对应表格的column中。这里有个规约:每个 column名字都是小写的,除了class的 properties使用的“驼峰”书写方式的 properties名字就需要使用“—”符号了。比如: releaseDate将被自动写成 release_date。但是你也可以通过Constraints or ORM DSL.定制。
One-to-one
class Face {
Nose nose
}
class Nose {
}
上面,我们使用了单向one-to-one 关联从 Face 到 Nose. 如果使用双向one-to-one 关联,看下面的代码:
class Face {
Nose nose
}
class Nose {
Face face
}
上面两段代码都很容易理解。下面我们看下第3段代码:
class Face {
Nose nose
}
class Nose {
static belongsTo = [face:Face]
}
上面我们使用了“ belongsTo ”,设置 Nose "属于" Face.
new Face(nose:new Nose()).save()
保存Face的同时,必须要保存Nose,因为这里是一个“ belongsTo ”关系,假如你使用下面的代码:
new Nose(face:new Face()).save() // will cause an error
将会产生错误。
就拿客户和订单来做比较,当然这里是使用一对一的,一个客户对应一个订单,保存客户的同时,你得把它的订单一起保存,因为这个订单是属于某个客户的,倒转过来思维,因为订单没有设置belongsTo,也就是说他不会关心他的客户是谁,可以把belongsTo这个看作是某个class的属性,如果你保存一个没有的属性当然会出错,不知道大家能不能理解,这个是我自己的意思。
继续:
def f = Face.get(1)
f.delete() // both Face and Nose deleted
删除某个Faces会同时删除对应的Nose,反过来不成立。就如上面所说的,既然某个Nose是某个Face的属性,因为设置了belongsTo,我们暂时这样来理解,如果客户都不存在,订单还有存在的价值吗,其实也就是一个class被删除了,属于他的属性还会继续存在吗?
分享到:
相关推荐
### Grails 1.1 Web Application Development #### 核心知识点概述 《Grails 1.1 Web Application Development》是一本专注于使用Grails框架进行高效Web应用开发的技术书籍。本书由作者Jon Dickinson撰写,旨在...
5. `grails-app/conf`:配置文件,如 `application.properties` 和 `grails-app/conf/Config.groovy`。 6. `test` 目录:存放单元测试和集成测试。 案例: 一个简单的 Grails 应用可能包括一个用户管理模块。在 `...
1. **紧密集成Java平台**:Grails充分利用Java平台的优势,如广泛的库支持和工具链,同时保持调用底层Java框架的灵活性。 2. **规约优于配置**:Grails遵循这一原则,通过文件名和目录结构来推断应用程序的结构,...
4. **变量作用域**:在 Grails 中,变量的作用域有 `page`、`request`、`flash`、`session` 和 `application` 等。例如,`flash` 用于存储临时消息,如错误信息等。 5. **特殊操作符**:如 `==` 和 `is` 分别对应 ...
Grails是一种基于Java平台的开源Web应用框架,它采用了Groovy编程语言,旨在提高开发效率和简化开发流程。Grails的设计理念是遵循“约定优于配置”原则,提供了一种快速开发全栈式Web应用的解决方案。由于其与Spring...
创建领域类(Domain Class)即可实现数据持久化,例如,创建一个名为Book的领域类,定义其属性如title、author等,Grails会自动为其生成相应的数据库表和增删查改方法。 在提供的【部分内容】中,`println...
在本教程中,我们将探讨如何使用GORM(Grails Object-Relational Mapping)构建Spring Boot应用程序。GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。...
【Grails 3 框架】是 Groovy 语言开发的一个全栈式Web应用框架,它集成了许多现代Java生态系统的组件,如Spring Boot、Hibernate等,提供了快速开发、自动化配置和灵活的元编程特性。Grails 3 的核心目标是提高开发...
Grails是一个基于Java平台的开源框架,它结合了Ruby on Rails的敏捷开发理念和Java的强类型、静态检查的优势,提供了一种快速开发全栈式Web应用的方式。 在**描述**中提到,该系统采用了EasyUI作为前端框架。EasyUI...
根据给定的信息,本文将对Java相关的架构图进行详细的解读与分析,主要涵盖Spring、Hibernate、Struts(包括Struts1和Struts2)、JSF、Seam、Grails、DWR、J2EE、Oracle等技术栈的核心概念及其架构特点。 ### 1. ...
and out-of-the-box operationalization make java development fun again I,m pleased to report that Spring and spring boot are the foundation of Netflix's new continuous delivery platform. What's more, ...