-------------------------------------------------------------------
1、持久化類的訪問者有兩個,一是JAVA應用程序,二是hibernate
寫:Java應用程序通過setter設置持久化對象的屬性,hibernate通過getter獲取持久化對象的屬性並生成相應的SQL語句對錶格進行操作。
讀:hibernate通過setter設置持久化對象的屬性,Java應用程序通過getter獲取持久化對象的屬性。
2、hibernate訪問持久化類屬性的策略
Hibernate通過name指定的值訪問持久化對象。Hibernate通過name值,反射持久化對象的對方法。比如,name的值爲gender。 Hibernate會直接反射持久化對象的getGender和setGender方法。所以我們必須保證持久化對象中有對應的方法。這是因爲property有一個access屬性,它的默認值爲property(推薦)。
如果指定access的值爲field,則hibernate直接根據name值反射持久化對象的屬性。此時,我們必須保證持久化對象中有對應的屬性。
3、 在持久化類的方法中加入程序邏輯
如果access的值爲property,hibernate直接反射持久化對象的方法。在這個方法中我們就可以加入程序邏輯。老徐舉了一個生動的例子,比如Customer類中有firstname和lastname兩個屬性。但我們只想讓hibernate通過getName方法獲得一個firstname+lastname的字符串,此時我們就可以在getName方法中將firstname與lastname兩個屬性值合併爲一箇中間使用 “.”連接的字符串返回。
使用hibernate獲取數據表中的數據時,hibernate會調用持久化對象的setName方法。我們在這個方法中將傳遞進來的參數使用“.”分隔,然後分別設置到firestname和lastname屬性中。
--------------------------------------------------------------------
因爲公司裏的項目使用註解對hibernate 的實體進行映射,這裏,映射存在兩種方式,一種是標註在field上,一種是標註在getter方法上,究竟這兩種方法有什麼不同呢,這個問題困擾了我很久。今天看到上面那解釋,寫終於解開了謎團。
就像第一點所說的那樣,pojo有兩個訪問者,一是java應用程序,而是hibernate,這兩者訪問是不同的,java應用程序是通過getter和setter方法來訪問的,hibernate是通過反射來訪問的,如果你的pojo需要被java訪問,那麼被訪問的屬性必須提供getter和setter方法,否則,就不需要了。hibernate訪問pojo是可配置的,默認是property,即通過getter和setter,這時你的pojo必須提供這兩個方法,如果設置爲field,那麼hibernate是直接反射field來獲取和設置值的,field就必須在pojo裏存在,這裏關鍵是明白第二點,即hibernate訪問持久化類策略的問題。
迴歸正題,就是關於那個註解標註位置問題,標註在field上就相當於設置access值爲field,getter上就相當於設置access值爲property
這裏有一篇不錯的技術博客介紹,相當有技巧
http://blog.sina.com.cn/s/blog_4b21f7e9010009cz.html
希望能幫助大家理解