溫馨提示×

溫馨提示×

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

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

在hibernate如何使用seqence的主鍵生成策略

發(fā)布時間:2021-12-06 09:11:23 來源:億速云 閱讀:321 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關在hibernate如何使用seqence的主鍵生成策略,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

在hibernate使用seqence的主鍵生成策略時候,要這樣寫(下面的寫法是針對HSQLDB,不清楚在其他數(shù)據庫也通用)

Xml代碼:

<id column="MY_ID">     <generator class="sequence">      <param name="sequence">MY_SEQUENCEparam>      <param name="parameters">        START WITH 1 INCREMENT BY 1       param>     generator>    <id>    <id column="MY_ID">  <generator class="sequence">   <param name="sequence">MY_SEQUENCEparam>   <param name="parameters">     START WITH 1 INCREMENT BY 1    param>  generator> <id>

hibernate實戰(zhàn)(第2版)書中是這樣寫的 INCREMENT 1 START WITH 1,這樣寫插入的call next value for MY_SEQUENCE 返回的是0,START WITH 1 INCREMENT BY 1 執(zhí)行call next value for MY_SEQUENCE返回的是1,這樣奇怪的問題,難道是hsqldb有bug?我也沒有去做過多的深究。

Xml代碼:

<class dynamic-insert="true" dynamic-update="true">

dynamic-insert 屬性告訴hibernate是否在insert語句中包含空的屬性值(設置為true,是表明在insert語句中不包含為null的屬性,也就是insert語句中包含的屬性必須是非空的字段)。

這兩個屬性在某些地方會有用,比如說在更新中設置dynamic-update=true,如果你僅僅更新了一個屬性,沒有必要把其他屬性的更新也放在sql中,也提高了數(shù)據庫的執(zhí)行效率。但是也帶來一個副作用,可能就是hibernate要進行比較每個屬性的值,來決定是否在sql語句中包含這個字段。當然這對 字段比較多的類是比較有用的。dynamic-insert在做insert操作時候,也是如此。

Xml代碼:

<hibernate-mapping default-access="field">    <class mutable="false">

標記這個類為不可變類。這樣hibernate就可以避免做臟檢查。為了保持這個不可變屬性,***不寫set方法,僅僅保留get方法。設置值通過構造來設置。還要明確指示hibernate訪問這個類的字段要通過field來訪問,而不是通過get-set方法,這個由 hibernate-mapping的 default-access="field"來設置。

Xml代碼:

<hibernate-mapping auto-import="false">     <import class="mypackage.Class" rename="Hello" />    hibernate-mapping>

一般情況下,你寫一個類的映射后,hibernate 會自動的導入到HQL的命名空間中。你在HQL查詢時候可以僅僅通過類名,而不是包名.類名來使用指定的類了。但是,存在這樣一種情況,如果在不同包中有相同的類名,在HQL中就會引起歧義,不過一個很好的辦法就是在hibernate-mapping中關閉自動導入的屬性,采取顯式導入,然后重命名之。這樣,你在HQL中就可以直接寫 from Hello,而避免了歧義。

Xml代碼:

<hibernate-mapping package="mypackage.model">

定義package這個屬性,可以在這個映射文件中給所有未以包名開頭的類名加上定義的包作為前綴。

Xml代碼:

<property name="description" column="`description`">

之所以加反引號,是因為你覺得可能description在特定的數(shù)據庫中是關鍵字。你加上反引號后,hibernate會為你針對不同的數(shù)據庫做特定的轉化。例如sqlserver,hibernate會為你加上[description],mysql加上`description`,另外在在hsqldb中給description加反引號后,產生的是"description",這樣執(zhí)行起來反而會報錯。

Xml代碼 :

<property name="description" column="desc" access="field">

指定description字段通過field直接訪問。

Xml代碼:

<property name="total" formula="total + tax_rate * total">

這個公式在每次查詢時候求值,并且這個屬性不會被保存和更新,如果你改變其中的數(shù)據例如tax_rate,屬性值不會去自動計算。

Xml代碼:

<property name="mydata" update="false" insert="false">

如果update和i nsert都設置false的話,這個字段就不會出現(xiàn)在INSERT和UPDATE語句中。通常不再類中給不可變的屬性添加公有的設置方法。

Xml代碼:

<property generated="always"

generated的合法值是always和insert。這個屬性通常和dynamic-insert配合起來才更有用。一般用來在屬性中插入默認值。

initial_price number(10, 2) default '1'

Xml代碼:

<property name="initial_price">     <column name="initial_price"   default="1" generated="insert"/>    property>

其中的default屬性,只在生成表結構時候有用。hibernate并不會在Java類中,給空的屬性設置默認值。

在插入有default屬性的字段中,要想使default起作用,必須設置dynamic-insert=true,這樣保證有default屬性的字段字段不會出現(xiàn)在insert中(default的字段為null),否則,它的值為null(插入NULL而不是默認值),另外默認值插入到數(shù)據庫之后,因為設置了generated=always,hibernate會在插入后自動的執(zhí)行一個select,給Java類中的屬性設置,如果沒有設置generated屬性,需要顯式調用session.flush()語句。

Xml代碼:

<class name="Hello">     <component name="Address">      <property name="">     <component>    class>

如果component中說有的屬性都為null,那么查詢時候,這個組件個引用是null,就是說hello.getAddress()返回的是null,只要有至少一個不為null,那么返回這個組件的引用將不是null。

關于“在hibernate如何使用seqence的主鍵生成策略”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI