1. 程式人生 > >hibernate之生成的和預設的屬性值(使用generated重新整理實體)

hibernate之生成的和預設的屬性值(使用generated重新整理實體)

生成的和預設的屬性值

如果類的一個特定屬性有著資料庫生成的值,通常在第一次插入實體行的時候。典型的資料庫生成的值是建立的時間戳 , 還有其它預設值等.      

每當hibernate給定義了已生成或預設屬性的實體執行SQL INSERT或UPDATE時,它在插入預設值或生成值之後立即執行SELECT。因為設定了generated=always,hibernate會在插入後自動的執行一個select,給Java類中的屬性設定,如果沒有設定generated屬性,需要顯式呼叫session.flush()語句。這裡就是說, 資料庫預設生成值的欄位,必須通過select後把值傳給java實體的該屬性。

使用property對映中的generated開關啟用這個自動重新整理:

<property name="lastModified" column="LAST_MODIFIED" update="false" insert="false" generated="always"/>

標記為資料庫生成的屬性還必須是非可插入和非可更新的,用insert和update屬性進行控制它們。如果兩者都設定為false,屬性的列就永遠不會出現在INSERT或者UPDATE語句中---屬性值是隻讀的。而且,通常不在類中給不可變的屬性新增公有的設定方法(這時應切換到欄位訪問).

關於generated=""的適用值說明:

never(預設):標明此屬性值不是從資料庫中生成, 也就是根本不用重新整理實體類了。

insert:標明此屬性值在insert的時候生成,但是不會在隨後的update時重新生成。也就是隻在insert情況下才會重新整理實體類。

always:標明此屬性值在insert和update時都會被生成。也就是在insert,update情況下都會重新整理實體類。

例1:

 

例2:

因為有了dynamic-insert="true" dynamic-update="true", 那麼沒有設值的屬性(age,createTime,updateTime)就不會出現在insert,update的資料庫執行語句中,所以也就沒有必要在各屬性上使用insert="false" update="false"。

例3,比較generated="always",generated="insert":

 

 

 

輸出日誌:

 

最後要注意的是,資料庫表的age,createTime,updateTime欄位上都要有預設值,或者有觸發器 ,不然上面所有例子的age,createTime,

updateTime在表中的值都是null.