北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

JPA初体验(使用Hibernate4实现)

Posted on 2012-05-22 12:14  CN.programmer.Luxh  阅读(5553)  评论(1编辑  收藏  举报

  JPA,一套相当优秀的持久化规范,开始体验。


 

  1、我使用Hibernate对JPA提供的实现,下载hibernate-release-4.1.1.Final.zip。解压。

  在hibernate-release-4.1.1.Final\lib目录下有四个存放jar包的目录,其中

   hibernate-release-4.1.1.Final\lib\jpa                   存放hibernate对JPA提供实现的jar

   hibernate-release-4.1.1.Final\lib\required            存放hibernate核心jar以及依赖的jar

  这两个目录下的所有jar是我们体验JPA所必需的。

 


 

  2、新建一个Java Project。

  2.1 导入hibernate-release-4.1.1.Final\lib\jpa目录和hibernate-release-4.1.1.Final\lib\required目录下的所有jar;导入mysql的数据库驱动包。

  2.2 在项目的classpath路径下建立META-INF目录

        在META-INF目录下建立persistence.xml文件

    

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persistence version="2.0" 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_2_0.xsd">
 6             
 7     <!-- 为持久化单元取名为 myJPA -->
 8     <persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">
 9         <properties>
10             <!--配置Hibernate方言 -->
11             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
12             <!--配置数据库驱动 -->
13             <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
14             <!--配置数据库用户名 -->
15             <property name="hibernate.connection.username" value="root" />
16             <!--配置数据库密码 -->
17             <property name="hibernate.connection.password" value="root" />
18             <!--配置数据库url -->
19             <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&amp;characterEncoding=UTF-8" />
20             <!--设置外连接抓取树的最大深度 -->
21             <property name="hibernate.max_fetch_depth" value="3" />
22             <!--自动输出schema创建DDL语句 -->
23             <property name="hibernate.hbm2ddl.auto" value="update" />    
24         </properties>
25     </persistence-unit>
26             
27 </persistence>

  

  用的是mysql,请建立一个名叫jpa的数据库:create database jpa default character set utf8;

  无需手动建表,执行测试的时候会自动建表

 


 

  3、项目视图如下:

  

 


 

  4、编写实体类。

  

 1 package com.cndatacom.jpa.entity;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="t_user")
11 public class User {
12     
13     /**
14      * 主键
15      */
16     @Id
17     @GeneratedValue
18     private Long id;
19     
20     /**
21      * 名字
22      */
23     @Column(name="name")
24     private String name;
25     
26     /**
27      * 密码
28      */
29     @Column(name="password")
30     private String password;
31 
32     public Long getId() {
33         return id;
34     }
35 
36     public void setId(Long id) {
37         this.id = id;
38     }
39 
40     public String getName() {
41         return name;
42     }
43 
44     public void setName(String name) {
45         this.name = name;
46     }
47 
48     public String getPassword() {
49         return password;
50     }
51 
52     public void setPassword(String password) {
53         this.password = password;
54     }
55     
56 }


5、编写测试类。

  

  1 package com.cndatacom.jpa.test;
  2 
  3 import javax.persistence.EntityManager;
  4 import javax.persistence.EntityManagerFactory;
  5 import javax.persistence.Persistence;
  6 
  7 import org.junit.After;
  8 import org.junit.Before;
  9 import org.junit.Test;
 10 
 11 import com.cndatacom.jpa.entity.User;
 12 
 13 
 14 public class TestJPA {
 15     
 16     EntityManagerFactory emf = null;
 17     
 18     @Before
 19     public void before() {
 20         //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory
 21         emf = Persistence.createEntityManagerFactory("myJPA");
 22     }
 23     
 24     /**
 25      * 添加用户
 26      */
 27     @Test
 28     public void addUser() {
 29         
 30         //创建一个用户
 31         User user = new User();
 32         user.setName("叶开");
 33         user.setPassword("yekai");
 34         
 35         //创建实体管理器对象
 36         EntityManager em = emf.createEntityManager();
 37         //开启事务
 38         em.getTransaction().begin();
 39         //持久化对象
 40         em.persist(user);
 41         //提交事务
 42         em.getTransaction().commit();
 43         //关闭EntityManager
 44         em.close();
 45     }
 46     
 47     /**
 48      * 修改用户(用户处于托管状态)
 49      */
 50     @Test
 51     public void modifyUser1() {
 52         EntityManager em = emf.createEntityManager();
 53         em.getTransaction().begin();
 54         //查找id为1的User,进行更新
 55         User user = em.find(User.class, 1L);//User 的主键id为Long型
 56         user.setName("楚留香");
 57         em.getTransaction().commit();
 58         em.close();
 59     }
 60     
 61     /**
 62      * 修改用户(用户处于游离(脱管)状态)
 63      */
 64     @Test
 65     public void modifyUser2() {
 66         EntityManager em = emf.createEntityManager();
 67         em.getTransaction().begin();
 68         //查找id为1的User,进行更新
 69         User user = em.find(User.class, 1L);//User 的主键id为Long型
 70         em.clear();//将实体管理器中的所有实体变成了游离态(脱管)
 71         user.setName("李寻欢");
 72         em.merge(user);//处于游离态的实体必须使用该方法才能更新
 73         em.getTransaction().commit();
 74         em.close();
 75     }
 76     
 77     
 78     
 79     /**
 80      * 删除用户
 81      */
 82     @Test
 83     public void deleteUser() {
 84         EntityManager em = emf.createEntityManager();
 85         em.getTransaction().begin();
 86         //查找id为1的User
 87         User user = em.find(User.class, 1L);//User 的主键id为Long型
 88         //进行删除
 89         em.remove(user);
 90         em.getTransaction().commit();
 91         em.close();
 92     }
 93     
 94     /**
 95      * 关闭EntityManagerFactory
 96      */
 97     @After
 98     public void after() {
 99         if(null != emf) {
100             emf.close();
101         }
102     }
103 
104 }

 

 

 


 

  6、一些说明。

  @Entity 将领域标注为一个实体,表示要保存到数据库中。

  @Table 指定在数据库中对应的表名

  @Id 对应的属性是表的主键

  @GeneratedValue 主键的产生策略,这里表示使用默认的GenerationType.AUTO

  @Column 属性对应数据库表中的列,name指定列名,不写name的话,属性名和列名一致。