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