在該系列的第1篇文章中,我們已提到JPA和Hibernate。下圖是二者在系統(tǒng)架構(gòu)中的作用:

由以上圖片我們可以得出兩個結(jié)論:首先JPA的主要作用就是持久化操作;其次JPA只是1種規(guī)范,它需要1種實現(xiàn),正如上圖顯示的,Hibernate、oPenJPA等等。簡單些,可以說JPA只是1套接口,本身不能完成任何事情。
而這篇博文的主要內(nèi)容就是對JPA和Hibernate學習的1個總結(jié)。首先來看1個最簡單的入門demo。
所需jar包:
hibernate3.jar
hibernate-cglib-repack⑵.1_3.jar
slf4j-api⑴.5.2.jar
javassist⑶.4.GA.jar
jta⑴.1.jar
antlr⑵.7.6.jar
commons-collections⑶.1.jar
dom4j⑴.6.1.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
log4j.jar
slf4j-log4j12.jar
創(chuàng)建實體類:
/***********************************************************************
* 模塊: 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") //默許情況下表名稱是根據(jù)實體類名稱創(chuàng)建的,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表示根據(jù)數(shù)據(jù)庫由Hibernate自動選擇生成策略,也能夠省略寫@GeneratedValue
(2)值為IDENTITY表示主鍵自增長
(3)值為SEQUENCE表示主鍵采取序列的方式
(4)值為TABLE各個數(shù)據(jù)庫都通用,但效力較低
創(chuàng)建完實體類以后,就需要寫JPA的配置文件了。JPA規(guī)范要求配置文件在類路徑的META-INF目錄下放置名稱為固定的的,即persistence.xml
<?xml version="1.0" encoding="UTF⑻"?>
<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>
<!--
數(shù)據(jù)庫方言 -->
<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>
其中,<property name="hibernate.hbm2ddl.auto" value="update" />表示建表方式,value值為creat-drop時表示創(chuàng)建利用的時候建表,結(jié)束利用的時候表自動刪除;值為update表示如果映照元數(shù)據(jù)不存在則建立表,如果映照元數(shù)據(jù)存在并新增加了字段則會添加到數(shù)據(jù)庫表中。
測試類:
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。不過在這里值得注意的是,關(guān)于EntityManager的獲得分別有兩種不同的方式。1種是@PersistenceContex注入;另外一種則是
JNDI取得。
這樣1個簡單的JPA+Hibernate就能夠履行數(shù)據(jù)庫持久化操作了。你明白了?