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

來源:互聯網
上載者:User

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

      在該系列的第一篇文章中,我們已經提到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就可以執行資料庫持久化操作了。你明白了?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.