程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> JPA(三):JPA+Hibernate基礎學習

JPA(三):JPA+Hibernate基礎學習

編輯:DB2教程

JPA(三):JPA+Hibernate基礎學習


在該系列的第一篇文章中,我們已經提到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>

其中,<property name="hibernate.hbm2ddl.auto" value="update" />表示建表方式,value值為creat-drop時表示創建應用的時候建表,結束應用的時候表自動刪除;值為update表示如果映射元數據不存在則建立表,如果映射元數據存在並新增加了字段則會添加到數據庫表中。

測試類:

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就可以執行數據庫持久化操作了。你明白了?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved