深圳的天氣開始轉暖了,也開始可以搶春節的火車票了,咱們的學習速度要和火車的速度一樣的話,一定從今往後一旺到底的。
繼續來探索hibernate的知識點
1、Hibernate中配置文件中數據類型date與timestamp區別
我們的小夥伴要是字段類型是private Timestamp time這樣的該怎麼去映射到hibernate呢,是不是需要加註解@Temporal(xxx)
首先我們先要了解數據庫的字段類型有date、time、datetime,
- date表示日期,其範圍爲1000-01-01到9999-12-31
- datetime表示日期時間,其範圍是1000-01-01 00:00:00到9999-12-31 23:59:59
- 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框架將忽略該屬性.
註解的解讀:
- @Column描述了數據庫表中該字段的詳細定義,這對於根據JPA註解生成數據庫表結構的工具非常有作用.
- name:表示數據庫表中該字段的名稱,默認情形屬性名稱一致
- nullable:表示該字段是否允許爲null,默認爲true
- unique:表示該字段是否是唯一標識,默認爲false
- length:表示該字段的大小,僅對String類型的字段有效 ,默認爲255個字符
- insertable:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中,默認爲true(insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等)
- updateable:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認爲true.對於一經創建就不可以更改的字段,該屬性非常有用,如對於birthday字段.
columnDefinition(大多數情況,幾乎不用):表示該字段在數據庫中的實際類型.通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是 TIMESTAMP.表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。columnDefinition屬性用於覆蓋數據庫DDL中的語句,真是無知無懼。)- 此外,String的默認映射類型爲VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用.
- unique 表示該字段是否爲唯一標識,默認爲false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
- table 表示當映射多個表時,指定表的表中的字段。默認值爲主表的表名。
- 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() {
..........
}
}