JPA

概述

JPA:Java Persistence API,用於對象持久化的API
Java EE 5.0平臺標準的ORM規範,使得應用程序以統一的方式訪問持久層

JPA和Hibernate的關係

JPA是規範,JPA實質上就是一種ORM規範,不是ORM框架——因爲JPA並未提供ORM實現,它只是制定了一些規範,提供了一些編程的API接口,但具體實現則由ORM廠商提供實現

JPA的供應商

JPA的目標之一是制定一個可以由很多供應商實現的API,目前Hibernate 3.2+、TopLink 10.1+以及OpenJPA都提供了JPA的實現

JPA包括3方面的技術

  1. ORM映射元數據:JPA支持XML和JDK 5.0註解兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象
  2. 持久化到數據庫表中。
  3. JPA的API:用來操作實體對象,執行CRUD操作,框架在後臺完成所有事情,開發者從頻繁的JDBC和SQL代碼中解脫出來。
  4. 查詢語言(JPQL):這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序和具體的SQL緊密耦合。

基礎配置

步驟

  1. 配置persistence.xml,persistence.xml位於META-INF目錄下
  2. 創建實體類,使用annotation來描述實體類跟數據庫表之間的映射關係
  3. 使用JPA API完成數據增刪改查操作(EntityManager)

需要用到的jar包

  • antlr-2.7.7.jar
  • dom4j-1.6.1.jar
  • hibernate-commons-annotations.jar
  • hibernate-core-4.2.4.Final.jar
  • hibernate-entitymanager-4.2.3.Final.jar
  • hibernate-jpa-2.0-api-1.0.1.Final.jar
  • javassist-3.15.0-GA.jar
  • jboss-logging-3.1.0.GA.jar
  • jboss-transaction-api_1.1_spec-1.0.jar
  • mysql-connector-java-5.1.7.bin.jar

配置persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    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_2_0.xsd">
    <persistence-unit name="jpa-01">
        <!-- 配置是用什麼ORM產品作爲JPA的實現 1. 實際上配置的是javax.persistence.spi.PersistenceProvider接口的實現類 
            2. 若JPA項目中只有一個JPA的實現產品,則也可以不配置該節點 -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.iuie.jpa.entity.Customer</class>

        <properties>
            <!-- 連接數據庫的基本信息 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///ns" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="123456" />

            <!-- 配置JPA實現產品的基本屬性,配置hibernate的基本屬性 -->
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl" value="update" />
        </properties>

    </persistence-unit>
</persistence>

常用註解

@GeneratedValue註解

作用

用於標註主鍵的生成策略,通過strategy屬性指定。默認情況下,JPA自動選擇一個最適合底層數據庫的主鍵生成策略:
- SQL Server:identity
- MySQL:auto increment

在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
- IDENTITY:採用數據庫ID自增長的方式來自增主鍵字段,Oracle不支持這種方式
- AUTO:JPA自動選擇合適的策略,是默認選項
- SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator註解指定程序名,MySQL不支持這種方式
- TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於數據庫移植

@Column註解

作用

設置每一列的屬性

屬性

  • name屬性:用於設置映射數據庫表的列名
  • unique屬性:指定是否允許重複值
  • length屬性:指定字段的長度
  • nullable屬性:指定是否非空

@Transient註解

作用

表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性如果一個屬性並非數據庫表的字段映射,就務必將其標示爲@Transient,否則,ORM框架默認將其註解爲@Basic

@Temporal註解

作用

指明日期的表達形式,value屬性需要指定TemporalType的枚舉值,
TemporalType 的枚舉值包括:
- TemporalType.TIMESTAMP // yyyy-MM-dd HH:mm:ss形式
- TemporalType.DATE // yyyy-MM-dd形式

示例

private Date loginTime;

private Date birthday;
// yyyy-MM-dd HH:mm:ss
@Temporal(TemporalType.TIMESTAMP)
public Date getLoginTime(){
    return this.loginTime;
}
public void setLoginTime(Date loginTime){
    this.loginTime=loginTime;
}
// yyyy-MM-dd
@Temporal(TemporalType.DATE)
public Date getBirthday(){
    return this.birthday;
}
public void setBirthday(Date birthday){
    this.birthday=birthday;
}

用table來生成主鍵策略

(使用的情景相對較少)

步驟

  1. 創建一個生成主鍵的表:

表名:JPA_ID_GENERATOR(數據表ID生成策略表)
columnName dataType length 是否主鍵 是否不爲空 描述
ID int 10 y y 生成表的ID
PK_NAME varchar 50 y 需要使用此策略的表名稱
PK_VALUE int 10 起始值,種子

  1. 插入幾個值

  2. 編寫Customer.java

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