ORM框架不止一种,包括JDO,iBatis,TopLink,KODO,OpenJPA等等多种开源的和商业的产品。那么这有什么问题呢?假设现在我们的项目是用Hibernate开发的,运行于
Oracle数据库之上,然而上线运行一段时间后,发现有一些性能上的问题,而这时候我们想找人来做技术支持,希望它来帮我们解决这些问题,因为开发人员并不是个个都能读懂
Hibernate的源码然后找到问题所在的。这是第一种可能:客户(通常是有钱的大客户)希望能在遇到问题时有人提供商业的技术支持和顾问服务。第二种可能:Oracle公司推出了
专用于对Oracle数据库特别优化过的ORM产品,名为TopLink,然而很不幸,虽然它能解决我们的问题,但是,因为Hibernate的类库的包结构和TopLink的相差太远,一个是以
org.hibernate开头的,另一个却是以com.oracle开头的,更要命的是,两者之间的类库根本就没有相似之处!那我们的项目并不能通过简单的将代码的包换一下,就能迁移成功,下载岂不是要所有涉及Hibernate的地方都得重写!换句话说,当我们使用Hibernate或者其
它ORM框架开发时,我们的代码已经被绑死了!虽然代码是和数据库无关的,然而数据库访问的Java代码却是死死的和某种框架绑定在一起了。
1创建JPAHello项目
1.1创建表格
CREATE TABLE Student(
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(200) NOT NULL,
PASSWORD VARCHAR(20) NOT NULL,
age INT,
PRIMARY KEY(id)
)ENGINE=MYISAM DEFAULT CHARSET=GBK;
1.2创建 HelloJPA Java Project
在MyEclipse 中我们可以将 JPA 开发功能添加到很多种项目上,一般最常见的恐怕就
是添加到Java项目或者Web项目上了。在本节我们打算用简单的Java Project ,便于展
示JPA如何工作。
首先确保已经打开了MyEclipse Java Enterprise透视图,然后进行下列操作:
1. 从MyEclipse 菜单栏选择 File > New > Java Project,接着会打开 New Java
Project 向导;
2. 输入 HelloJPA到 Project name ;
3. 在Project Layout 下选中 Create separate source and output folders 单选钮;
4. 点击Finish按钮关闭对话框。
这样Java项目就建立完毕了。稍等片刻会弹出一个切换透视图的对话框,为了避免造成更
多的麻烦,我们一般选择No按钮就可以了。
1.3添加 JPA Capabilities 到现有项目
按图执行以下操作:
1.4 使用JPA配置文件编辑器修改文件
打开/src/META-INF/persistence.xml
修改后如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="JavaEE_JPAPU"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>dao.Student</class>
<properties>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url"
value="jdbc:mysql://127.0.0.1:3310/jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password"
value="123456" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.NoCacheProvider" />
</properties>
</persistence-unit>
</persistence>
1.5 使用反向工程快速生成JPA实体类和DAO
首先打开MyEclipse Database Explorer透视图。切换透视图有两种办法,如何切换请参考3.1.3透视图(Perspective)切换器。一种比较快办法是如那一节介绍的,点击工具栏上的点击 按钮可以显示多个透视图供切换,如图3.3所示,然后单击其中的MyEclipse Database Explorer 即可切换到此透视图;另一种办法是选择菜单 Window > Open Perspective > Other > MyEclipse Database Explorer来显示打开透视图对话框,然后点击OK按钮。
按图步骤操作:
1.6 调整生成的实体类标注
调整后的实体类如下:
package dao;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Student entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "student", catalog = "jpa")
public class Student implements java.io.Serializable {
// Fields
private Integer id;
private String username;
private String password;
private Integer age;
// Constructors
/** default constructor */
public Student() {
}
/** minimal constructor */
public Student(String username, String password) {
this.username = username;
this.password = password;
}
/** full constructor */
public Student(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
// Property accessors
@Id
@Column(name = "id", unique = true, nullable = false, insertable = true, updatable=true)
@javax.persistence.GeneratedValue(strategy=javax.persistence.GenerationType.IDENTITY)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "username", nullable = false, length = 200)
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password", nullable = false, length = 20)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "age")
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.7 编写测试代码
package test;
import java.util.List;
import dao.*;
public class JPATest {
public static void main(String args[]){
//创建dao
StudentDAO dao = new StudentDAO();
//创建实体类
Student user = new Student();
user.setUsername("hellojpa test");
user.setPassword("jpa password");
user.setAge(20);
EntityManagerHelper.beginTransaction();
//保存
dao.save(user);
//提交事务真正保存实体到数据库
EntityManagerHelper.commit();
//列出数据库中所有对象
List<Student> result = dao.findAll();
for(Student o: result){
System.out.println(o.getId());
System.out.println(o.getUsername());
}
//更改用户名
user.setUsername("测试JPA");
//开始事务
EntityManagerHelper.beginTransaction();
dao.update(user);
//提交事务真正保存实体到数据库
EntityManagerHelper.commit();
//查找所有年龄为20的用户,从第1个开始获取(0为第一个用户)
result = dao.findByAge(20, 0);
for(Student o:result){
System.out.println(o.getId());
System.out.println(o.getUsername());
}
//根据用户ID查找
user = dao.findById(2);
System.out.println(user.getUsername());
//删除
//开始事务
EntityManagerHelper.beginTransaction();
//保存(JPA会自动更新变动过的字段)
dao.delete(user);
//提交事务真正保存实体到数据库
EntityManagerHelper.commit();
}
}
测试结果:
JPA其他部分:
JPA生成一对多等复杂映射代码
Spring整合JPA开发
参见文档:http://download.csdn.net/detail/xueyedie1234/4746521