JPA初體驗(使用Hibernate4實現)


  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的話,屬性名和列名一致。

  

   

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM