Hibernate框架整合JPA註解基礎實踐

Hibernate框架整合JPA註解基礎事件

1.JPA註解

  • Entity

    @javax.persistence.Entity(name=”xxx”)

    name指定實體Bean的名稱,默認值爲 bean class 的非限定類名,select o from xxx o where o.id=?1

  • Table

    @javax.persistence.Table(catalog=”xx”,name=”xx”,schema=”xx”,uniqueConstraints={UniqueConstraint(columnNames={“xx”,”xx”})})

name:指定表的名稱
catalog:指定數據庫名稱
schema:指定數據庫的用戶名
uniqueConstraints:指定唯一性字段約束,如爲personid 和name 字段指定唯一性約束
uniqueConstraints={ @UniqueConstraint(columnNames={“personid”, “name”})}

@Table標記表示所映射表的屬性,該註釋的屬性定義如下:

@Target({TYPE}) 
@Retention(RUNTIME)   
public @interface Table {
    String name() default "";
    String catalog() default "";
    String schema() default "";
    UniqueConstraint[] uniqueConstraints() default {};
}

在使用此@Table標記時,需要注意以下幾個問題。
此標記需要標註在類名前,不能標註在方法或屬性前。
name屬性表示實體所對應表的名稱,默認表名爲實體的名稱。
catalog和schema屬性表示實體指定的目錄名或是數據庫名,這根據不同的數據庫類型有所不同。
uniqueConstraints屬性表示該實體所關聯的唯一約束條件,一個實體可以有多個唯一約束條件,默認沒有約束條件。
若使用uniqueConstraints標記時,需要配合標記UniqueConstraint標記來使用。

  • Id

    @javax.persistence.Id()

    映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射爲主鍵.

  • GeneratedValue

    @javax.persistence.GeneratedValue(generator=”xxx”,strategy=GenerationType.AUTO)

    strategy:表示主鍵生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4種
    分別表示讓ORM框架自動選擇,根據數據庫的Identity字段生成,根據數據庫表的Sequence字段生成,以有根據一個額外的表生成主鍵,默認爲AUTO
    generator:表示主鍵生成器的名稱,這個屬性通常和ORM框架相關,例如,Hibernate可以指定uuid等主鍵生成方式.

例程:使用UUID作爲數據庫的主鍵類型

Hibernate UUID    
@Id   
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid",strategy = "uuid")

  • Basic

@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)

fetch:抓取策略,延時加載與立即加載
optional:指定在生成數據庫結構時字段是否允許爲 null
  • Column

@javax.persistence.Column(length=15,nullable=false,columnDefinition=”“,insertable=true,scale=10,table=”“,updatable=true)

name:字段的名稱,默認與屬性名稱一致    
nullable:是否允許爲null,默認爲true
unique:是否唯一,默認爲false 
length:字段的長度,僅對String類型的字段有效 
columnDefinition:表示該字段在數據庫中的實際類型   

通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,
但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是TIMESTAMP,
此外,String的默認映射類型爲VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用
如: @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
insertable:默認情況下,JPA持續性提供程序假設所有列始終包含在 SQL INSERT 語句中。
如果該列不應包含在這些語句中,請將 insertable 設置爲 false
updatable:列始終包含在 SQL UPDATE 語句中。如果該列不應包含在這些語句中,請將 updatable 設置爲 false
table:實體的所有持久字段都存儲到一個其名稱爲實體名稱的數據庫表中,如果該列與 @SecondaryTable表關聯
需將 name 設置爲相應輔助表名稱的String名稱

  • Temporal

    @javax.persistence.Temporal(TemporalType.DATE)

    value:TemporalType.DATE,TemporalType.TIME,TemporalType.TIMESTAMP時間類型格式

  • Enumerated

    @javax.persistence.Enumerated(EnumType.STRING)

    value:EnumType.STRING,EnumType.ORDINAL
    枚舉類型成員屬性映射,EnumType.STRING指定屬性映射爲字符串,EnumType.ORDINAL指定屬性映射爲數據序

  • Lob

    @javax.persistence.Lob
    用於標註字段類型爲Clob和Blob類型
    Clob(Character Large Ojects)類型是長字符串類型,實體的類型可爲char[]、Character[]、或者String類型
    Blob(Binary Large Objects)類型是字節類型,實體的類型可爲byte[]、Byte[]、或者實現了Serializable接口的類。
    通常使用惰性加載的方式, @Basic(fetch=FetchType.LAZY)

  • Transient

    @javax.persistence.Transient

    @Transient表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性

  • SecondaryTable

    @javax.persistence.SecondaryTable

將一個實體映射到多個數據庫表中
如:

@Entity
@SecondaryTables({ @SecondaryTable(name = "Address"), @SecondaryTable(name = "Comments") })
public class Forum implements Serializable {
    @Column(table = "Address", length = 100) 
    private String street; 
    @Column(table = "Address", nullable = false) 
    private String city; 
    @Column(table = "Address") 
    private String conutry; 
    @Column(table = "Comments") 
    private String title; 
    @Column(table = "Comments") 
    private String Comments; 
    @Column(table = "Comments") 
}

table屬性的值指定字段存儲的表名稱, 沒有用 @Column 註解改變屬性默認的字段將會存在於 Forum 表


  • @Embeddable

@javax.persistence.Embeddable
嵌套映射,在被嵌套的類中使用Embeddable註解,說明這個就是一個可被嵌套的類,使用 @Embedded
當同一個類被不同的註解方式的類嵌套時,可能會出現一些錯誤,使用@Access(AccessType. FIELD)設定被嵌套類的註解方式
@javax.persistence.Id()
映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射爲主鍵.


2. 創建Java Project

創建一個Java Project,引入Hibernate框架的相關jar包、mysql-connector的包,還有JUnit的相關jar包,目錄結構如下:
img

3. 創建數據庫

創建一個數據庫jpadb,用於本次JPA與Hibernate的整合的測試
create database `jpadb`;
無需創建相關表,Hibernate會幫助我們創建對應的表

4. 創建POJO類

需要創建一個POJO類,對其對應的私有變量加上相關的JPA註解

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")
public class Student implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name",length = 30)
    private String name;

    @Column(name = "password",length = 16)
    private String password;

    public Integer getId() {
     return id;
    }

    public void setId(Integer id) {
     this.id = id;
    }

    public String getName() {
     return name;
    }

    public void setName(String name) {
     this.name = name;
    }

    public String getPassword() {
     return password;
    }

    public void setPassword(String password) {
     this.password = password;
    }

    @Override
    public String toString() {
       return "Student [id=" + id + ", name=" + name + ", password="
            + password + "]";
    }
}

5. hiberante.cfg.xml配置

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <session-factory>
        <!--數據庫連接相關變量-->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/jpadb</property>
        <property name="connection.username">root</property>
        <property name="connection.password">shouhu1314</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!--配置數據庫方言-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--控制檯顯示執行的SQL語句-->
        <property name="show_sql">true</property>
        <!--自動更新數據庫表結構-->
        <property name="hbm2ddl.auto">update</property>

        <!--配置映射,由於使用JPA註解,故不必在加入對應的hbm.xml文件的ref-->
        <mapping class="com.ljn.pojo.Student"/>
    </session-factory>
</hibernate-configuration>

6. JUnit測試

創建一個JUnit Case,編寫代碼測試

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.pojo.Student;

public class StudentTest {

    @SuppressWarnings("deprecation")
    @Test
    public void test() {
        Configuration configuration = new AnnotationConfiguration().configure();      
        SessionFactory sessionFactory = configuration.buildSessionFactory();    
        Session session = null;
        Transaction transaction = null;

        try {
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
            //創建一個Student實例,並設置屬性
            Student student = new Student();
            student.setName("Jimmy");
            student.setGrade(99.5);
            //在持久層保存Student實例
            session.save(student);
            //提交事務,將數據保存到數據庫
            transaction.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            transaction.rollback();
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
            sessionFactory.close();
        }
    }
}

7. 測試結果

數據庫自動完成了創建student表,併成功插入了一條記錄
img

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章