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

来源:互联网 发布:炫舞炸家族邀请软件 编辑:程序博客网 时间:2024/06/05 00:14
为什么使用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创建表格
[sql] view plain copy print?
  1. CREATE TABLE Student(  
  2.     id INT NOT NULL AUTO_INCREMENT,  
  3.     username VARCHAR(200) NOT NULL,  
  4.     PASSWORD VARCHAR(20) NOT NULL,  
  5.     age INT,  
  6.     PRIMARY KEY(id)  
  7. )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

修改后如下:
[html] view plain copy print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
  5.     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">  
  6.       
  7.     <persistence-unit name="JavaEE_JPAPU"  
  8.         transaction-type="RESOURCE_LOCAL">  
  9.         <provider>org.hibernate.ejb.HibernatePersistence</provider>  
  10.         <class>dao.Student</class>  
  11.         <properties>  
  12.             <property name="hibernate.connection.driver_class"  
  13.                 value="com.mysql.jdbc.Driver" />  
  14.             <property name="hibernate.connection.url"  
  15.                 value="jdbc:mysql://127.0.0.1:3310/jpa" />  
  16.             <property name="hibernate.connection.username" value="root" />  
  17.             <property name="hibernate.connection.password"  
  18.                 value="123456" />  
  19.             <property name="hibernate.hbm2ddl.auto" value="update" />  
  20.             <property name="hibernate.dialect"  
  21.                 value="org.hibernate.dialect.MySQLDialect" />  
  22.             <property name="hibernate.show_sql" value="true" />  
  23.             <property name="hibernate.cache.provider_class"  
  24.                 value="org.hibernate.cache.NoCacheProvider" />  
  25.         </properties>  
  26.     </persistence-unit>  
  27.   
  28. </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 调整生成的实体类标注

调整后的实体类如下:

[cpp] view plain copy print?
  1. package dao;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import static javax.persistence.GenerationType.IDENTITY;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.Table;  
  9.   
  10. /** 
  11.  * Student entity. @author MyEclipse Persistence Tools 
  12.  */  
  13. @Entity  
  14. @Table(name = "student", catalog = "jpa")  
  15. public class Student implements java.io.Serializable {  
  16.   
  17.     // Fields  
  18.   
  19.     private Integer id;  
  20.     private String username;  
  21.     private String password;  
  22.     private Integer age;  
  23.   
  24.     // Constructors  
  25.   
  26.     /** default constructor */  
  27.     public Student() {  
  28.     }  
  29.   
  30.     /** minimal constructor */  
  31.     public Student(String username, String password) {  
  32.         this.username = username;  
  33.         this.password = password;  
  34.     }  
  35.   
  36.     /** full constructor */  
  37.     public Student(String username, String password, Integer age) {  
  38.         this.username = username;  
  39.         this.password = password;  
  40.         this.age = age;  
  41.     }  
  42.   
  43.     // Property accessors  
  44.     @Id  
  45.     @Column(name = "id", unique = true, nullable = false, insertable = true, updatable=true)  
  46.     @javax.persistence.GeneratedValue(strategy=javax.persistence.GenerationType.IDENTITY)  
  47.     public Integer getId() {  
  48.         return this.id;  
  49.     }  
  50.   
  51.     public void setId(Integer id) {  
  52.         this.id = id;  
  53.     }  
  54.   
  55.     @Column(name = "username", nullable = false, length = 200)  
  56.     public String getUsername() {  
  57.         return this.username;  
  58.     }  
  59.   
  60.     public void setUsername(String username) {  
  61.         this.username = username;  
  62.     }  
  63.   
  64.     @Column(name = "password", nullable = false, length = 20)  
  65.     public String getPassword() {  
  66.         return this.password;  
  67.     }  
  68.   
  69.     public void setPassword(String password) {  
  70.         this.password = password;  
  71.     }  
  72.   
  73.     @Column(name = "age")  
  74.     public Integer getAge() {  
  75.         return this.age;  
  76.     }  
  77.   
  78.     public void setAge(Integer age) {  
  79.         this.age = age;  
  80.     }  
  81.   

1.7 编写测试代码
[java] view plain copy print?
  1. package test;  
  2. import java.util.List;  
  3. import dao.*;  
  4.   
  5. public class JPATest {  
  6.     public static void main(String args[]){  
  7.         //创建dao  
  8.         StudentDAO dao = new StudentDAO();  
  9.         //创建实体类  
  10.         Student user = new Student();  
  11.         user.setUsername("hellojpa test");  
  12.         user.setPassword("jpa password");  
  13.         user.setAge(20);  
  14.         EntityManagerHelper.beginTransaction();  
  15.         //保存  
  16.         dao.save(user);  
  17.         //提交事务真正保存实体到数据库  
  18.         EntityManagerHelper.commit();  
  19.           
  20.         //列出数据库中所有对象  
  21.         List<Student> result  = dao.findAll();  
  22.         for(Student o: result){  
  23.             System.out.println(o.getId());  
  24.             System.out.println(o.getUsername());  
  25.         }  
  26.         //更改用户名  
  27.         user.setUsername("测试JPA");  
  28.           
  29.         //开始事务  
  30.         EntityManagerHelper.beginTransaction();  
  31.         dao.update(user);  
  32.           
  33.         //提交事务真正保存实体到数据库  
  34.         EntityManagerHelper.commit();  
  35.           
  36.         //查找所有年龄为20的用户,从第1个开始获取(0为第一个用户)  
  37.         result  = dao.findByAge(200);  
  38.           
  39.         for(Student o:result){  
  40.             System.out.println(o.getId());  
  41.             System.out.println(o.getUsername());  
  42.         }  
  43.           
  44.         //根据用户ID查找  
  45.         user = dao.findById(2);  
  46.           
  47.         System.out.println(user.getUsername());  
  48.           
  49.         //删除  
  50.         //开始事务  
  51.         EntityManagerHelper.beginTransaction();  
  52.         //保存(JPA会自动更新变动过的字段)  
  53.         dao.delete(user);  
  54.           
  55.         //提交事务真正保存实体到数据库  
  56.         EntityManagerHelper.commit();      
  57.           
  58.     }  

测试结果:



JPA其他部分:

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

Spring整合JPA开发
原创粉丝点击