JPA是什么?怎样开发JPA应用?

时间:2022-09-11 12:41:01
为什么使用JPA?

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 到现有项目

按图执行以下操作:

JPA是什么?怎样开发JPA应用?


JPA是什么?怎样开发JPA应用?

JPA是什么?怎样开发JPA应用?

JPA是什么?怎样开发JPA应用?




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按钮。


按图步骤操作:

JPA是什么?怎样开发JPA应用?
JPA是什么?怎样开发JPA应用?

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应用?

JPA其他部分:

JPA生成一对多等复杂映射代码

Spring整合JPA开发

参见文档:http://download.csdn.net/detail/xueyedie1234/4746521