在該系列的第一篇文章中,我們已經提到JPA和Hibernate。下圖是兩者在系統架構中的作用:
由以上圖片我們可以得出兩個結論:首先JPA的主要作用就是持久化操作;其次JPA只是一種規范,它需要一種實現,正如上圖顯示的,Hibernate、oPenJPA等等。簡單些,可以說JPA只是一套接口,本身不能完成任何事情。
而這篇博文的主要內容就是對JPA和Hibernate學習的一個總結。首先來看一個最簡單的入門demo。
所需jar包:
hibernate3.jar
hibernate-cglib-repack-2.1_3.jar
slf4j-api-1.5.2.jar
javassist-3.4.GA.jar
jta-1.1.jar
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
log4j.jar
slf4j-log4j12.jar
創建實體類:
/*********************************************************************** * 模塊: BuildType.java * 作者: Jones * 說明: Defines the Class BuildType * 日期: 2014年12月2日 20:56:11 ***********************************************************************/ package com.tgb.itoo.basic.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import org.codehaus.jackson.annotate.JsonIgnore; import org.hibernate.annotations.GenericGenerator; /** * 建築類型 */ @Entity @Table(name = "TB_BuildType") //默認情況下表名稱是根據實體類名稱創建的,name可以修改表名稱 public class BuildType extends EntityDelete{ @Id @GenericGenerator(name = "uuidGenerator", strategy = "com.tgb.itoo.base.util.uuid.Base58UuidGenerator") @GeneratedValue(generator = "uuidGenerator") @Column(name = "id", length = 22) private String id; /** * 類型代碼 * */ @Column(name = "buildTypeCode", length = 255) private String buildTypeCode; /** * 類型名稱 */ @Column(name = "buildTypeName", length = 255) private String buildTypeName; /** * 建築類型中有的建築信息 */ @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "buildType", targetEntity = Build.class) private Set<Build> builds = new HashSet<Build>(); //*************************get/set方法*******************************// /** * 建築類型中有的建築信息 */ public Set<Build> getBuilds() { return builds; } /** * 建築類型中有的建築信息 */ public void setBuilds(Set<Build> builds) { this.builds = builds; } /** * 類型代碼 */ public String getBuildTypeCode() { return buildTypeCode; } /** * 類型代碼 */ public void setBuildTypeCode(String buildTypeCode) { this.buildTypeCode = buildTypeCode; } /** * 類型名稱 */ public String getBuildTypeName() { return buildTypeName; } /** * 類型名稱 */ public void setBuildTypeName(String buildTypeName) { this.buildTypeName = buildTypeName; } /** * 主鍵id */ public String getId() { return id; } public void setId(String id) { this.id = id; } }
其中主鍵生成策略@GeneratedValue(strategy=GenerationType.AUTO)中:
(1)值為AUTO表示根據數據庫由Hibernate自動選擇生成策略,也可以省略寫@GeneratedValue
(2)值為IDENTITY表示主鍵自增長
(3)值為SEQUENCE表示主鍵采用序列的方式
(4)值為TABLE各個數據庫都通用,但效率較低
創建完實體類之後,就需要寫JPA的配置文件了。JPA規范要求配置文件在類路徑的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"> <!-- 持久化單元,transaction-type事務類型包括全局事務類型JTA和本地事務類型 RESOURCE_LOCAL--> <persistence-unit name="basic-entity" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:jboss/datasources/JcMysqlDS</jta-data-source> <properties> <!-- 數據庫方言 --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence>
測試類:
public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save(){ //Persistence.createEntityManagerFactory("jpa")與配置文件中的持久化單元名稱必須相同 EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); //保存(持久化)方法 em.persist(new Person("Tom")); em.getTransaction().commit(); em.close(); factory.close(); } }
其中EntityManagerFactory相當於Hibernate中的sessionFactory,EntityManager則相當於Hibernate中session。不過在這裡值得注意的是,關於EntityManager的獲取分別有兩種不同的方式。一種是@PersistenceContex注入;另一種則是 JNDI獲得。
這樣一個簡單的JPA+Hibernate就可以執行數據庫持久化操作了。你明白了?