學習Hibernate JPA

來源:互聯網
上載者:User
近年來ORM(Object-Relational Mapping;對象關係映射,即實體物件和資料庫表的映射)技術市場人聲音鼎沸,異常熱鬧, Sun在充分吸收現有的優秀ORM架構設計思想的基礎上,制定了新的JPA(Java Persistence API)規範。 那麼什麼是JPA呢?JPA是通過JDK5.0註解或XML描述對象-關係表的映射關係,並將運行期實體物件持久化到資料庫中去。

近年來ORM(Object-Relational Mapping;對象關係映射,即實體物件和資料庫表的映射)技術市場人聲音鼎沸,異常熱鬧, Sun在充分吸收現有的優秀ORM架構設計思想的基礎上,制定了新的JPA(Java Persistence API)規範。那麼什麼是JPA呢?JPA是通過JDK5.0註解或XML描述對象-關係表的映射關係,並將運行期實體物件持久化到資料庫中去。這裡我們要先談一下什麼叫實體(Entity),按照JPA規範,具有ORM中繼資料的領域對象就叫做實體。它應具備一下條件:1.必須使用javax.persistence.Entity註解或XML對應檔中有對應的<entity>元素;2.必須具有一個不帶參數的建構函式,類不能聲明為final,方法和需要持久化的屬性也不能聲明為final;3.如果游離態的實體物件需要以值的方式進行傳遞(如通過Session bean的遠程業務介面傳遞),則必須實現Serializable介面;4.需要持久化的屬性,起存取修飾詞不能是public,它必須通過實體類方法進行訪問。 下面我們來嘗試對一個域對象進行JPA註解,使其成為一個實體類:
@Entity(name=”T_TEST”)
public class Test implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
@Column(name=” id”)
private int testId;

@Column(name=”uname”,length=100)
private String uname;

@Column(name=”password”)
private String password;

@Column(name=”time”)
@Temporal(TemporalType.Date)
private Date loginTime;

省略get/setter方法
}
下面對以上代碼中所涉及的JPA註解進行一下說明@Entity:將領域對象標註為一個實體類,表示該類需要持久化到資料庫中,預設情況下類名即表名,通過name屬性顯式指定表名,如:name=”T_TEST”表示將Test儲存到表T_TEST表中。@Id:對應的屬性是表的主鍵@GeneratedValue:主鍵的產生策略,通過strategy屬性進行指定,預設情況下,JPA自動選擇一個最適合底層資料庫的主鍵建置原則,如SqlServer對應的identity:mysql對應的auto increment,在java.persistence.GenerationType中定義了幾種可以供選擇的策略:1.  :表自動成長欄位,Oracle不支援這種方式;Identity2.  :JPA自動選擇合適的策略,是預設選項;AUTO3.  :通過序列產生主鍵,通過@SequenceGenerator註解指定序列名,Mysql不支援這種方式。Sequence4.  :通過表產生主鍵,架構藉由表類比產生主鍵,使用該策略可以使用更易於資料庫的移植。TABLE @Colunm(name=”uname”):屬性對應的表欄位。我們並不需要指定表欄位的類型,因為JPA 會根據反射從實體屬性中擷取類型;如果是字串類型,我們可以指定欄位長度,以便可以自動產生DDL語句。 @Temporal(TemporalType.DATE):如果屬性是時間類型,因為資料表對時間類型有更嚴格的劃分,所以必須指定具體時間類型,在java.persistence.TemporalType枚舉中定義了三種時間類型:Date:等於java.sql.Date;Time:等於java.sql.Time;TimeStamp:等於java.sql.Timestamp。 JPA對於具有父子關係的類,對於父類必須聲明繼承實體的映射策略,對於繼承實體,java.persistence.InheritanceType定義了3種映射策略:SINGLE_TABLE:父子類都儲存在同一個表中,通過欄位值進行區分。JOINED:父子類相同的部分儲存在同一個表中,不同的部門分開存放,通過串連不同的表擷取完整資料。TABLE_PER_CLASS:每一個類對應自己的表,一般不推薦採用這種方式。下面我們來看看實際的列子是怎麼運用的。父類Test@Entity(name=”test”)@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//指定繼承策略@DiscriminatorColumn(name=”types”,discriminatorType=DiscriminatorType.INTEGER,length=1)//指定區分欄位為types,類型為Integer長度為1@DiscriminatorValue(value=”1”)//對應具體實體的值public class Test implements Serializable{     …..} 子類Child@Entity@DiscriminatorValue(value=”2”)public class Child extends Test{     //如果我們不希望JPA將該屬性持久化到資料庫,則採用該註解@Transientprivate String tempStr; @Lob //lob類型的欄位@Basic(fetch=FetchType.Lazy) //採用消極式載入,FetchType.EAGER不採用@Column(name=”postattach”,columnDefinition=”LONGTEXT NOT NULL”)對應欄位類型private String postAttach; }可以看到通過欄位types來區分父子類資料,也是相當方便的。至於JPA提供的關聯關係比如說一對多,多對一,多對多,也有相應的註解進行關聯,有興趣的朋友可以參考相關協助文檔。 以上講述的都是JPA中以註解形式進行持久化,下面我們來看下採用XML中繼資料的形式,XML中繼資料資訊以orm.xml命名,放置在類路徑的META-INF 目錄下。 
<?xml version=”1.0” encoding=”UTF-8”?>
<entity-mappings
xmlns=”http://java.sun.com/xml/ns/persistence/orm” xmlns=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd”
version=”1.0”>
<package>com.test</package>
<entity class=”Test”>
<table name=”test”/>
<attributes>
<id name=”id”>
<column name=”id”/>
<generated-value strategy=”TABLE”/>
</id>
<basic name=”uname”>
<column name=”uname” length=”30”/>
</basic>
<basic name=”logintime”>
<column name=” logintime”/>
<temporal>DATE</temporal>
</basic>
</attributes>
</entity>
<entity-mappings>
可以看到JPA中繼資料採用XML形式也是相當簡單易懂的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.