Hibernate5的學習筆記(三)之註解解讀

深圳的天氣開始轉暖了,也開始可以搶春節的火車票了,咱們的學習速度要和火車的速度一樣的話,一定從今往後一旺到底的。

繼續來探索hibernate的知識點

1、Hibernate中配置文件中數據類型date與timestamp區別

我們的小夥伴要是字段類型是private Timestamp time這樣的該怎麼去映射到hibernate呢,是不是需要加註解@Temporal(xxx)

首先我們先要了解數據庫的字段類型有date、time、datetime,

  1. date表示日期,其範圍爲1000-01-01到9999-12-31
  2. datetime表示日期時間,其範圍是1000-01-01 00:00:00到9999-12-31 23:59:59
  3. timestamp表示時間戳,1970-01-01 00:00:00到2038-01-19 03:14:07,timestamp具有自動初始化和自動更新功能。

@Temporal都是加在字段上或者加在getXXX()方法上
Temporal註解的作用就是幫Java的Date類型進行格式化,一共有三種註解值:

  第一種:@Temporal(TemporalType.DATE)——>實體類會封裝成日期“yyyy-MM-dd”的 Date類型。

  第二種:@Temporal(TemporalType.TIME)——>實體類會封裝成時間“hh-MM-ss”的 Date類型。

  第三種:@Temporal(TemporalType.TIMESTAMP)——>實體類會封裝成完整的時間“yyyy-MM-dd hh:MM:ss”的 Date類型。

一開始我以爲使用該標註後,該屬性的值會被自動賦值。不需要在插入數據時,給該屬性賦值。哈哈哈,太年輕,其實並不會更何況這個註解是針對在某類中有Date類型的屬性。

我相信一定也會有TIMESTAMP類型的格式化的,但是看官網api也是這樣的解釋:

目前我的做法還是很老套的,name.setDelTime(new Timestamp(System.currentTimeMillis()));

我也想找點先進的方法比如將TimeStamp類型的改成Date類型,然後再加註解,當然是成功了才告訴你們的啦~~


    @Column(name = "time")
    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp  這個註解是和@DynamicUpdate同效果,兩個一起用倒是會失效
    public Date getTime() {
        return time;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name ="createdOn",updatable = false) 
    //讓其更新的時候不更新值,需要在實體類上加@DynamicUpdate,
    //如果是使用了@DynamicUpdate其他需要改變的值就要設置,不使用的話就直接在對應字段使用
    @org.hibernate.annotations.CreationTimestamp
    public Date createdOn;

2、Hibernate中save,update,saveOrUpdate的用法和區別

在Hibernate中實體類PO會有三種狀態的變化trasient(自由態),persistent(持久態),detached(遊離態)。

當新new一個PO,new ApplePO(“xxx”)的時候還沒有和session關聯這時候是po的實例處於transient自由態。

例如利用session通過get()和load()得到的PO是和數據庫建立了映射關係的PO實體類處於persisent持久態。

雖然從get和load獲取的PO是屬於持久態,但是使用delete(PO)的時候這個PO就成了遊離態,當然還是有辦法挽救的,遊離態的PO通過save()或者saveOrUpdate()可以將其變回持久態persistent。

還有一種情況就是 當把session關閉時,session緩存中的persistent的po對象也變成detached。

因關閉session而變成遊離態的可以通過lock、save、update變成持久態。

3、Hibernate實體類的註解@Column屬性解讀

不加這個註解你會死的很慘,有以下的錯誤就要注意了!!!

Hibernate會直接在你的數據庫裏增加未添加註解的字段,當不是數據庫的字段一定要加上@Transient。

@Transient表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性.

註解的解讀:

  1. @Column描述了數據庫表中該字段的詳細定義,這對於根據JPA註解生成數據庫表結構的工具非常有作用.
  2. name:表示數據庫表中該字段的名稱,默認情形屬性名稱一致
  3. nullable:表示該字段是否允許爲null,默認爲true
  4. unique:表示該字段是否是唯一標識,默認爲false
  5. length:表示該字段的大小,僅對String類型的字段有效 ,默認爲255個字符
  6. insertable:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中,默認爲true(insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等
  7. updateable:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認爲true.對於一經創建就不可以更改的字段,該屬性非常有用,如對於birthday字段.
  8. columnDefinition(大多數情況,幾乎不用):表示該字段在數據庫中的實際類型.通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是 TIMESTAMP.表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。columnDefinition屬性用於覆蓋數據庫DDL中的語句,真是無知無懼。)
  9. 此外,String的默認映射類型爲VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用.
  10. unique 表示該字段是否爲唯一標識,默認爲false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
  11.  table 表示當映射多個表時,指定表的表中的字段。默認值爲主表的表名。
  12. precision和scale precision屬性和scale屬性表示精度,當字段類型爲double時,precision表示數值的總長度,scale表示小數點所佔的位數。

4、Hibernate的@Embedded


/**@Embedded將幾個字段組合成一個類,並作爲整個Entity的一個屬性.
例如User包括id,name,city,street,zip屬性.
我們希望city,street,zip屬性映射爲Address對象.這樣,User對象將具有id,name和address這三個屬性.
Address對象必須定義爲@Embededable
示例:*/
    @Embeddable
    public class Address {
        city,street,zip
    }
     @Entity
     public class User {
        @Embedded
        public Address getAddress() {
             ..........
                }
        }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章