现在的位置: 首页 > 综合 > 正文

Appfuse 2 Persistence

2013年10月20日 ⁄ 综合 ⁄ 共 3884字 ⁄ 字号 评论关闭
英文版网址http://appfuse.org/display/APF/Persistence
 
中文版
-------
关于本教程
本教程讨论了如何建立数据库中的表,并编写Java代码进行访问数据表.
一个数据库对象(数据表)将被建立起来,并使用一些类对它进行持久化操作和查询(保存、查询、删除)。按照Java的说法,这个对象被称为普通传统的Java对象 (POJO)--(实际上是指:普通JavaBeans.,基本上就是对应数据库里的一张表.AppFuse 1.x中,典型的做法是创建一个 DAO 和使用JUnit单元测试,对这个POJO进行持久化。然而,在2.x里,以为你准备好了基本的具有CRUD方法的DAO和管理类(there is a Generics-based DAO and Manager that will CRUD all objects for you)。仅在需要定制或需要深入探索时才需要建立自己的DAO.
AppFuse 使用 Hibernate 作为默认的持久化层。Hibernate是一个关联Java对象和数据库表的对象/关系框架(Object/Relational (O/R) Framework),有助于更容易地对数据库对象执行CRUD操作 (Create, Retrieve, Update, Delete).
iBATIS JPA
持久化框架的另外的选择是iBATIS或者 JPA . AppFuse中使用iBATIS 参见教程using iBATIS ,用JPA参见教程-using JPA.
为了能在AppFuse项目框架下建立对象及其对应的数据表,请继续读完下面的教程内容。
译者注:JPA 规范允许开发人员将 Java 类批注为实体,这些实体可以保存到一个数据存储库中,在实际的 Java 源代码中提供其他元数据信息。JPA 同样允许开发人员和应用程序部署人员在外部 XML 文件中指定同样的对象关系映射数据。开发人员和部署人员可以选择在特定情况中使用 XML 文件覆盖源代码内的批注或使用 XML 映射完全覆盖任意源代码批注。
开发人员喜欢源代码内的批注,因为元数据与它所描述的代码位于同一位置。在较大的项目中,应用程序部署团队与开发团队可能不会总是同一组人员,在这种情况中,使用外部描述的对象关系映射元数据覆盖源代码内的批注有优势。选择外部定义的对象关系映射数据而不是源代码内批注的其他原因包括:风格偏好(普遍选择外部配置而不是代码内配置)、经常更改批注值,以及更改配置而不需要重新编译源代码。
目录
1.      创建POJO并加上JPA 批注
2.      使用Maven根据Java对象建立数据库表
创建POJO并加上JPA 批注
首先,建立一个要持久化的对象。以建立对象"Person" 为例, (基本原型(basic archetypes)的源码位于src/main/java/**/model目录;模块化原型(modular archetypes)的源码位于core/src/main/java/**/model目录下),它由一个id, 一个 firstName 和一个 lastName 组成(也称为属性)至于推荐的包命名规范,参加FAQ,在本教程里,使用"org.appfuse.tutorial" 作为顶级包名.
package org.appfuse.tutorial.model;
import org.appfuse.model.BaseObject;
public class Person extends BaseObject {
    private Long id;
    private String firstName;
    private String lastName;
    /* 使用常用的IDE创建getters 和setters 方法:*/
}
继承BaseObject 是可选的, 但是推荐作为一个良好实践原则来强制建立toString(), equals()hashCode()方法. 如果计划把这些对象用于用户对话(user's session)或通过web service暴露出来,最好还要实现java.io.Serializable.
为方便生成toString(), equals()hashCode()方法,可以使用插件Commonclipse. 更多参考资料参见Lee Grey's site. 另外也可使用Eclipse插件Commons4E来完成. 当自动生成或手工编写equals()hashCode()方法时,不要把对象的主键(primary key)也包含进去,具体原因参见Hibernate Equals and Hascode .
IntelliJ用户
如果使用IntelliJ IDEA, 可以自动生成equals() hashCode(), toString()不行. 可以使用插件ToStringPlugin来帮助创建.
现在POJO 建好了,下面需要添加JPA annotations.这些批注是Hibernate用于实现对象表和属性 (变量) 列的映射.
If you're new to Hibernate and Annotations, you might want to read An Introduction to Hibernate 3 Annotationsby John Ferguson Smart.
首先,添加一个@Entity批注,声明本对象与哪张表相关联. 其中的"name" 是可选的,如果没指定就默认使用class . 要确认是使用javax.persistence.*来实现批注(annotations),而不是Hibernate.
@Entity
public class Person extends BaseObject {
如果为@Entity批注指定了name (如:@Entity(name="person")),它将用于HQL 查询的别名,如果没指定将使用这个类的简短命名(short name),如Person .如果仅想改变生成的对应的表名,可使用带用”name”值的@Table批注来实现.
为指定主键(primary key) 需要添加@Id批注,@GeneratedValue批注用于指定主键值的生成策略(generation strategy.
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return this.id;
}
至于其他的域(属性),一般不必进行批注,除非以下情况: 1) 不需要持久化 (使用批注@Transient) 2) 需要修改列名或其他属性. 改变列名使用批注@Column. 以下是在getFirstName()getLastName()方法里使用@Column批注的例子:
@Column(name="first_name", length=50)
public String getFirstName() {
    return this.firstName;
}
...
@Column(name="last_name", length=50)
public String getLastName() {
    return this.lastName;
}
域级批注
也可以使用域级的JPA批注来代替getters方法. 然而,要知道,一旦添加了域级别的批注,方法级别的批注将被不再起作用(method-level annotations will be ignored.
使用Maven根据Java类建立数据库表
如果是用基本原形(basic archetypes),就打开文件src/main/resources/hibernate.cfg.xml (模块化原形,打开core/src/main/resources/hibernate.cfg.xml ),使用以下XML语句注册Person对象:
<mapping class="org.appfuse.tutorial.model.Person"/>
保存文件,从命令行运行以下命令: mvn test-compile hibernate3:hbm2ddl. 模块化原形要注意,在"core" 目录下运行这个命令。Mvn会在创建包含"person"表的数据库模式(database schema),建表语句如下:
create table person (id bigint not null auto_increment, first_name varchar(50), primary key (id)) type=InnoDB;
现在已经创建了一个 POJO,并据以生成了相关的数据表(schema, 那该如何来持久化对象呢? AppFuse 附带了GenericDao 的实现,用于对任何对象进行CRUD操作. 除了这个基于 Generics 的类外, 还可以使用UniversalDao来做同样的事情. 二者的主要区别在于,使用UniversalDao需要设置特别的类型(specified type),然而却不必定义新的Spring beans, 可见是有利有弊的. 在这里,将学习使用GenericDao来编程.
请选择下面的持久化框架,以便继续进行:
1Hibernate
2:Ibatis
3:JPA
 
如果无法分辨那个更适用你的项目,请看这篇文章: Hibernate vs. iBATIS

 

抱歉!评论已关闭.