成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate的類型分類

開發(fā) 后端
Hibernate類型有三中:Hibernate實(shí)體(Entities)和值(values),Hibernate基本值類型,3. Hibernate自定義值類型

Hibernate 有哪些類型呢?如果不清楚那么你看過(guò)本文,相信你對(duì)Hibernate類型一定會(huì)明白很多。

1. 實(shí)體(Entities)和值(values)

為了理解很多與持久化服務(wù)相關(guān)的Java語(yǔ)言級(jí)對(duì)象的行為,我們需要把它們分為兩類:

實(shí)體entity 獨(dú)立于任何持有實(shí)體引用的對(duì)象。與通常的Java模型相比,不再被引用的對(duì)象會(huì)被當(dāng)作垃圾收集掉。實(shí)體必須被顯式的保存和刪除(除非保存和刪除是從父實(shí)體向子實(shí)體引發(fā)的級(jí)聯(lián))。這和ODMG模型中關(guān)于對(duì)象通過(guò)可觸及保持持久性有一些不同——比較起來(lái)更加接近應(yīng)用程序?qū)ο笸ǔT谝粋€(gè)大系統(tǒng)中的使用方法。實(shí)體支持循環(huán)引用和交叉引用,它們也可以加上版本信息。

一個(gè)實(shí)體的持久狀態(tài)包含指向其他實(shí)體和值類型實(shí)例的引用。值可以是原始類型,集合(不是集合中的對(duì)象),組件或者特定的不可變對(duì)象。與實(shí)體不同,值(特別是集合和組件)是通過(guò)可觸及性來(lái)進(jìn)行持久化和刪除的。因?yàn)橹祵?duì)象(和原始類型數(shù)據(jù))是隨著包含他們的實(shí)體而被持久化和刪除的,他們不能被獨(dú)立的加上版本信息。值沒(méi)有獨(dú)立的標(biāo)識(shí),所以他們不能被兩個(gè)實(shí)體或者集合共享。

直到現(xiàn)在,我們都一直使用術(shù)語(yǔ)“持久類”(persistent class)來(lái)代表實(shí)體。我們?nèi)匀粫?huì)這么做。 然而嚴(yán)格說(shuō)來(lái),不是所有的用戶自定義的,帶有持久化狀態(tài)的類都是實(shí)體。組件就是用戶自定義類,卻是值語(yǔ)義的。java.lang.String類型的java屬性也是值語(yǔ)義的。給了這個(gè)定義以后,我們可以說(shuō)所有JDK提供的類型(類)都是值類型的語(yǔ)義,而用于自定義類型可能被映射為實(shí)體類型或值類型語(yǔ)義。采用哪種類型的語(yǔ)義取決于開發(fā)人員。在領(lǐng)域模型中,尋找實(shí)體類的一個(gè)好線索是共享引用指向這個(gè)類的單一實(shí)例,而組合或聚合通常被轉(zhuǎn)化為值類型。

我們會(huì)在本文檔中重復(fù)碰到這兩個(gè)概念。

挑戰(zhàn)在于將java類型系統(tǒng)(和開發(fā)者定義的實(shí)體和值類型)映射到 SQL/數(shù)據(jù)庫(kù)類型系統(tǒng)。Hibernate提供了連接兩個(gè)系統(tǒng)之間的橋梁:對(duì)于實(shí)體類型,我們使用, 等等。對(duì)于值類型,我們使用 , 及其他,通常跟隨著type屬性。這個(gè)屬性的值是Hibernate 的映射類型的名字。Hibernate提供了許多現(xiàn)成的映射(標(biāo)準(zhǔn)的JDK值類型)。你也可以編寫自己的映射類型并實(shí)現(xiàn)自定義的變換策略,隨后我們會(huì)看到這點(diǎn)。

所有的Hibernate內(nèi)建類型,除了collections以外,都支持空(null)語(yǔ)義。

2. 基本值Hibernate類型

內(nèi)建的 基本映射類型可以大致分為integer, long, short, float, double, character, byte, boolean, yes_no, true_false 這些類型都對(duì)應(yīng)Java的原始類型或者其封裝類,來(lái)符合(特定廠商的)SQL 字段類型。boolean, yes_no 和 true_false都是Java 中boolean 或者java.lang.Boolean的另外說(shuō)法。

string 從java.lang.String 到 VARCHAR (或者 Oracle的 VARCHAR2)的映射。

date, time, timestamp 從java.util.Date和其子類到SQL類型DATE, TIME 和TIMESTAMP (或等價(jià)類型)的映射。

calendar, calendar_date 從java.util.Calendar 到SQL 類型TIMESTAMP和 DATE(或等價(jià)類型)的映射。

big_decimal, big_integer 從java.math.BigDecimal和java.math.BigInteger到NUMERIC (或者 Oracle 的NUMBER類型)的映射。

locale, timezone, currency 從java.util.Locale, java.util.TimeZone 和java.util.Currency 到VARCHAR (或者 Oracle 的VARCHAR2類型)的映射. Locale和 Currency 的實(shí)例被映射為它們的ISO代碼。TimeZone的實(shí)例被影射為它的ID。

class 從java.lang.Class 到 VARCHAR (或者 Oracle 的VARCHAR2類型)的映射。Class被映射為它的全限定名。

binary 把字節(jié)數(shù)組(byte arrays)映射為對(duì)應(yīng)的 SQL二進(jìn)制類型。

text 把長(zhǎng)Java字符串映射為SQL的CLOB或者TEXT類型。

serializable 把可序列化的Java類型映射到對(duì)應(yīng)的SQL二進(jìn)制類型。你也可以為一個(gè)并非默認(rèn)為基本類型的可序列化Java類或者接口指定Hibernate類型serializable。

clob, blob JDBC 類 java.sql.Clob 和 java.sql.Blob的映射。某些程序可能不適合使用這個(gè)類型,因?yàn)閎lob和clob對(duì)象可能在一個(gè)事務(wù)之外是無(wú)法重用的。(而且, 驅(qū)動(dòng)程序?qū)@種類型的支持充滿著補(bǔ)丁和前后矛盾。)

imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date, imm_serializable, imm_binary 一般來(lái)說(shuō),映射類型被假定為是可變的Java類型,只有對(duì)不可變Java類型,Hibernate會(huì)采取特定的優(yōu)化措施,應(yīng)用程序會(huì)把這些對(duì)象作為不可變對(duì)象處理。比如,你不應(yīng)該對(duì)作為imm_timestamp映射的Date執(zhí)行Date.setTime()。要改變屬性的值,并且保存這一改變,應(yīng)用程序必須對(duì)這一屬性重新設(shè)置一個(gè)新的(不一樣的)對(duì)象。


實(shí)體及其集合的***標(biāo)識(shí)可以是除了binary、 blob 和 clob之外的任何基礎(chǔ)類型。(聯(lián)合標(biāo)識(shí)也是允許的,后面會(huì)說(shuō)到。)

在org.hibernate.Hibernate中,定義了基礎(chǔ)類型對(duì)應(yīng)的Type常量。比如,Hibernate.STRING代表string 類型。

3. 自定義值Hibernate類型

開發(fā)者創(chuàng)建屬于他們自己的值類型也是很容易的。比如說(shuō),你可能希望持久化java.lang.BigInteger類型的屬性,持久化成為VARCHAR字段。Hibernate沒(méi)有內(nèi)置這樣一種類型。自定義類型能夠映射一個(gè)屬性(或集合元素)到不止一個(gè)數(shù)據(jù)庫(kù)表字段。比如說(shuō),你可能有這樣的Java屬性:getName()/setName(),這是java.lang.String類型的,對(duì)應(yīng)的持久化到三個(gè)字段:FIRST_NAME, INITIAL, SURNAME。

要實(shí)現(xiàn)一個(gè)自定義類型,可以實(shí)現(xiàn)org.hibernate.UserType或org.hibernate.CompositeUserType中的任一個(gè),并且使用類型的Java全限定類名來(lái)定義屬性。請(qǐng)查看org.hibernate.test.DoubleStringType這個(gè)例子,看看它是怎么做的。

  1. <property name="twoStrings" type="org.hibernate.test.DoubleStringType"> 
  2.     <column name="first_string"/> 
  3.     <column name="second_string"/> 
  4. property> 

注意使用標(biāo)簽來(lái)把一個(gè)屬性映射到多個(gè)字段的做法。

CompositeUserType, EnhancedUserType, UserCollectionType, 和 UserVersionType 接口為更特殊的使用方式提供支持。

你甚至可以在一個(gè)映射文件中提供參數(shù)給一個(gè)UserType。 為了這樣做,你的UserType必須實(shí)現(xiàn)org.hibernate.usertype.ParameterizedType接口。為了給自定義類型提供參數(shù),你可以在映射文件中使用元素。

  1. <property name="priority"> 
  2.     <type name="com.mycompany.usertypes.DefaultValueIntegerType"> 
  3.         <param name="default">0param> 
  4.     type> 
  5. property> 

現(xiàn)在,UserType 可以從傳入的Properties對(duì)象中得到default 參數(shù)的值。

如果你非常頻繁地使用某一UserType,可以為他定義一個(gè)簡(jiǎn)稱。這可以通過(guò)使用 元素來(lái)實(shí)現(xiàn)。Typedefs為一自定義類型賦予一個(gè)名稱,并且如果此類型是參數(shù)化的,還可以包含一系列默認(rèn)的參數(shù)值。

  1. <typedef class="com.mycompany.usertypes.DefaultValueIntegerType" name="default_zero"> 
  2.     <param name="default">0param> 
  3. typedef> 
  4. <property name="priority" type="default_zero"/> 

也可以根據(jù)具體案例通過(guò)屬性映射中的類型參數(shù)覆蓋在typedef中提供的參數(shù)。

盡管 Hibernate 內(nèi)建的豐富的類型和對(duì)組件的支持意味著你可能很少 需要使用自定義類型。不過(guò),為那些在你的應(yīng)用中經(jīng)常出現(xiàn)的(非實(shí)體)類使用自定義類型也是一個(gè)好方法。例如,一個(gè)MonetaryAmount類使用CompositeUserType來(lái)映射是不錯(cuò)的選擇,雖然他可以很容易地被映射成組件。這樣做的動(dòng)機(jī)之一是抽象。使用自定義類型,以后假若你改變表示金額的方法時(shí),它可以保證映射文件不需要修改。
 

【編輯推薦】

  1. 簡(jiǎn)述Hibernate中加載并存儲(chǔ)對(duì)象
  2. Hibernate傳播性持久化攻略
  3. 深入了解Hibernate自動(dòng)狀態(tài)檢測(cè)
  4. 簡(jiǎn)單學(xué)會(huì)Hibernate對(duì)象持久化
  5. 分析Hibernate自增主鍵
責(zé)任編輯:仲衡 來(lái)源: javanb
相關(guān)推薦

2009-06-30 14:08:00

Hibernate緩存

2009-09-23 14:23:51

Hibernate主鍵

2009-09-28 09:40:28

Hibernate集合延遲加載

2009-07-02 09:23:27

Hibernate緩存

2009-09-25 12:31:13

Hibernate映射

2010-03-11 15:56:15

Python列表

2009-06-29 18:21:29

Hibernate

2009-06-24 08:04:18

Hibernate基礎(chǔ)核心接口數(shù)據(jù)類型

2009-06-18 11:43:40

Hibernate uHibernate s

2009-10-21 10:50:59

Linux文件類型

2009-06-18 15:53:37

Hibernate B

2012-02-03 11:31:33

HibernateJava

2009-06-06 15:37:22

Hibernate性能

2009-06-26 10:01:00

Hibernate的查

2009-06-26 10:06:00

游離狀態(tài)Hibernate

2012-02-03 11:17:33

HibernateJava

2009-07-02 09:40:14

Hibernate的繼

2012-02-08 14:24:35

HibernateJava

2010-08-26 09:44:42

db2數(shù)據(jù)類型

2010-05-25 10:28:20

IPv6地址類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 黄网站色大毛片 | 日韩在线中文 | 天天草天天干 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 成人在线亚洲 | 日韩中文字幕高清 | 激情 婷婷 | 欧美中文在线 | 日韩精品一区二区三区中文在线 | 九九热免费看 | 久久久久久免费免费 | 国产精品99久久久久久动医院 | 欧美激情久久久 | 91精品在线观看入口 | 精品久久精品 | 黄色精品视频网站 | 免费观看一级特黄欧美大片 | 国产做a爱免费视频 | 在线视频91| 国产成人99久久亚洲综合精品 | 亚洲精品9999久久久久 | 91中文视频 | 日韩三级在线 | 免费成人高清在线视频 | 久久久久久免费看 | 懂色av色香蕉一区二区蜜桃 | 精品九九九 | 日韩精品免费视频 | 国产女人叫床高潮大片免费 | 最新中文字幕在线 | 蜜桃特黄a∨片免费观看 | 精品国产一区二区三区久久影院 | 狠狠操狠狠干 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 综合激情av | 成人性视频免费网站 | 日韩一区二区三区av | 天天草天天干天天 | 国产成人精品一区二区三区四区 | 91久久国产综合久久91精品网站 | 91高清在线观看 |