亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate中有哪些類型分類

發布時間:2021-08-10 17:58:51 來源:億速云 閱讀:157 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Hibernate中有哪些類型分類,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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

為了理解很多與持久化服務相關的Java語言級對象的行為,我們需要把它們分為兩類:

實體entity 獨立于任何持有實體引用的對象。與通常的Java模型相比,不再被引用的對象會被當作垃圾收集掉。實體必須被顯式的保存和刪除(除非保存和刪除是從父實體向子實體引發的級聯)。這和ODMG模型中關于對象通過可觸及保持持久性有一些不同——比較起來更加接近應用程序對象通常在一個大系統中的使用方法。實體支持循環引用和交叉引用,它們也可以加上版本信息。

一個實體的持久狀態包含指向其他實體和值類型實例的引用。值可以是原始類型,集合(不是集合中的對象),組件或者特定的不可變對象。與實體不同,值(特別是集合和組件)是通過可觸及性來進行持久化和刪除的。因為值對象(和原始類型數據)是隨著包含他們的實體而被持久化和刪除的,他們不能被獨立的加上版本信息。值沒有獨立的標識,所以他們不能被兩個實體或者集合共享。

直到現在,我們都一直使用術語“持久類”(persistent class)來代表實體。我們仍然會這么做。 然而嚴格說來,不是所有的用戶自定義的,帶有持久化狀態的類都是實體。組件就是用戶自定義類,卻是值語義的。java.lang.String類型的java屬性也是值語義的。給了這個定義以后,我們可以說所有JDK提供的類型(類)都是值類型的語義,而用于自定義類型可能被映射為實體類型或值類型語義。采用哪種類型的語義取決于開發人員。在領域模型中,尋找實體類的一個好線索是共享引用指向這個類的單一實例,而組合或聚合通常被轉化為值類型。

我們會在本文檔中重復碰到這兩個概念。

挑戰在于將java類型系統(和開發者定義的實體和值類型)映射到 SQL/數據庫類型系統。Hibernate提供了連接兩個系統之間的橋梁:對于實體類型,我們使用,等等。對于值類型,我們使用,及其他,通常跟隨著type屬性。這個屬性的值是Hibernate 的映射類型的名字。Hibernate提供了許多現成的映射(標準的JDK值類型)。你也可以編寫自己的映射類型并實現自定義的變換策略,隨后我們會看到這點。

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

2. 基本值Hibernate類型

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

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

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

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

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 的實例被映射為它們的ISO代碼。TimeZone的實例被影射為它的ID。

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

binary 把字節數組(byte arrays)映射為對應的 SQL二進制類型。

text 把長Java字符串映射為SQL的CLOB或者TEXT類型。

serializable 把可序列化的Java類型映射到對應的SQL二進制類型。你也可以為一個并非默認為基本類型的可序列化Java類或者接口指定Hibernate類型serializable。

clob, blob JDBC 類 java.sql.Clob 和 java.sql.Blob的映射。某些程序可能不適合使用這個類型,因為blob和clob對象可能在一個事務之外是無法重用的。(而且, 驅動程序對這種類型的支持充滿著補丁和前后矛盾。)

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


實體及其集合的***標識可以是除了binary、 blob 和 clob之外的任何基礎類型。(聯合標識也是允許的,后面會說到。)

在org.hibernate.Hibernate中,定義了基礎類型對應的Type常量。比如,Hibernate.STRING代表string 類型。

3. 自定義值Hibernate類型

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

要實現一個自定義類型,可以實現org.hibernate.UserType或org.hibernate.CompositeUserType中的任一個,并且使用類型的Java全限定類名來定義屬性。請查看org.hibernate.test.DoubleStringType這個例子,看看它是怎么做的。

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

注意使用標簽來把一個屬性映射到多個字段的做法。

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

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

<property name="priority">     <type name="com.mycompany.usertypes.DefaultValueIntegerType">         <param name="default">0param>     type> property>

現在,UserType 可以從傳入的Properties對象中得到default 參數的值。

如果你非常頻繁地使用某一UserType,可以為他定義一個簡稱。這可以通過使用元素來實現。Typedefs為一自定義類型賦予一個名稱,并且如果此類型是參數化的,還可以包含一系列默認的參數值。

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

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

以上就是Hibernate中有哪些類型分類,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漳州市| 旅游| 定结县| 东城区| 微博| 左权县| 吉安市| 天长市| 昭通市| 旌德县| 宁波市| 德惠市| 东兰县| 龙山县| 阜城县| 罗田县| 准格尔旗| 怀化市| 子长县| 五大连池市| 昭平县| 广南县| 鹤壁市| 木里| 石阡县| 深水埗区| 正蓝旗| 松溪县| 柘荣县| 沛县| 诏安县| 宁安市| 肃宁县| 武山县| 嘉禾县| 胶州市| 宁化县| 石景山区| 阿瓦提县| 盐津县| 鄂托克前旗|