隨筆-9  評論-168  文章-266  trackbacks-0

          生成的和默認的屬性值

           

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

          每當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:

          1. package pojo;  
          2. import java.io.Serializable;  
          3. import java.util.Calendar;  
          4. public class Student implements Serializable{  
          5.     private String id;  
          6.     private String name;  
          7.     //刪除age的公共設置方法  
          8.     private int age;  
          9.     //刪除createTime的公共設置方法  
          10.     private Calendar createTime;  
          11.     //刪除updateTime的公共設置方法  
          12.     private Calendar updateTime;  
          13.       
          14.     public String getId() {  
          15.         return id;  
          16.     }  
          17.     @SuppressWarnings("unused")  
          18.     private void setId(String id) {  
          19.         this.id = id;  
          20.     }  
          21.     public String getName() {  
          22.         return name;  
          23.     }  
          24.     public void setName(String name) {  
          25.         this.name = name;  
          26.     }  
          27.     public int getAge() {  
          28.         return age;  
          29.     }  
          30.     public Calendar getCreateTime() {  
          31.         return createTime;  
          32.     }  
          33.     public Calendar getUpdateTime() {  
          34.         return updateTime;  
          35.     }  
          36. }  
           

           

          1. <?xml version="1.0" encoding="UTF-8"?>    
          2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"    
          3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
          4. <hibernate-mapping package="pojo">    
          5.     <class name="Student" table="A_STUDENT">    
          6.         <id name="id" column="ID" type="string">    
          7.             <generator class="uuid.hex"/>    
          8.         </id>  
          9.         <property name="name" column="NAME" type="string"/>  
          10.         <!-- insert="false",update="false" : 設置屬性為只讀, 該字段不會出現在insert,update中。                    -->  
          11.         <!-- access : 設置直接以字段訪問                                                                          -->  
          12.         <!-- generated="always" : 在insert或update情況下,hibernate為表字段生成默認值之后,會刷新實體類,把生成的 -->  
          13.         <!-- 默認值返回給實體類。                                                                                  -->  
          14.         <property name="age" column="AGE" type="integer" insert="false" update="false"   
          15.             access="field" generated="always"/>    
          16.         <property name="createTime" column="CREATETIME" type="calendar" insert="false"   
          17.             update="false" access="field" generated="always"/>    
          18.         <property name="updateTime" column="UPDATETIME" type="calendar" insert="false"   
          19.             update="false" access="field" generated="always"/>     
          20.     </class>    
          21. </hibernate-mapping>  

           

           

          例2:

          1. package pojo;  
          2. import java.io.Serializable;  
          3. import java.util.Calendar;  
          4. public class Student implements Serializable{  
          5.     private String id;  
          6.     private String name;  
          7.     //刪除age的公共設置方法  
          8.     private int age;  
          9.     //刪除createTime的公共設置方法  
          10.     private Calendar createTime;  
          11.     //刪除updateTime的公共設置方法  
          12.     private Calendar updateTime;  
          13.       
          14.     public String getId() {  
          15.         return id;  
          16.     }  
          17.     @SuppressWarnings("unused")  
          18.     private void setId(String id) {  
          19.         this.id = id;  
          20.     }  
          21.     public String getName() {  
          22.         return name;  
          23.     }  
          24.     public void setName(String name) {  
          25.         this.name = name;  
          26.     }  
          27.     public int getAge() {  
          28.         return age;  
          29.     }  
          30.     public Calendar getCreateTime() {  
          31.         return createTime;  
          32.     }  
          33.     public Calendar getUpdateTime() {  
          34.         return updateTime;  
          35.     }  
          36. }  

           

          1. <?xml version="1.0" encoding="UTF-8"?>    
          2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"    
          3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
          4. <hibernate-mapping package="pojo">    
          5.     <class name="Student" table="A_STUDENT" dynamic-insert="true" dynamic-update="true">    
          6.         <id name="id" column="ID" type="string">    
          7.             <generator class="uuid.hex"/>    
          8.         </id>  
          9.         <property name="name" column="NAME" type="string"/>  
          10.         <!-- 有了dynamic-insert="true",dynamic-update="true"就不需要update="false" insert="false"了     -->                                     
          11.         <!-- access : 設置直接以字段訪問                                                                  -->  
          12.         <!-- generated="always" : 在insert或update情況下,hibernate為表字段                                -->  
          13.         <!-- 生成默認值之后,會刷新實體類,把生成的默認值返回給實體類。                                       -->  
          14.         <property name="age"         column="AGE"        type="integer"  access="field" generated="always"/>    
          15.         <property name="createTime" column="CREATETIME" type="calendar" access="field" generated="always"/>    
          16.         <property name="updateTime" column="UPDATETIME" type="calendar" access="field" generated="always"/>     
          17.     </class>    
          18. </hibernate-mapping>  

           

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

           

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

          1. package pojo;  
          2. import java.io.Serializable;  
          3. import java.util.Calendar;  
          4. public class Student implements Serializable{  
          5.     private String id;  
          6.     private String name;  
          7.     //刪除age的公共設置方法  
          8.     private int age;  
          9.     //刪除createTime的公共設置方法  
          10.     private Calendar createTime;  
          11.     //刪除updateTime的公共設置方法  
          12.     private Calendar updateTime;  
          13.       
          14.     public String getId() {  
          15.         return id;  
          16.     }  
          17.     @SuppressWarnings("unused")  
          18.     private void setId(String id) {  
          19.         this.id = id;  
          20.     }  
          21.     public String getName() {  
          22.         return name;  
          23.     }  
          24.     public void setName(String name) {  
          25.         this.name = name;  
          26.     }  
          27.     public int getAge() {  
          28.         return age;  
          29.     }  
          30.     public Calendar getCreateTime() {  
          31.         return createTime;  
          32.     }  
          33.     public Calendar getUpdateTime() {  
          34.         return updateTime;  
          35.     }  
          36. }  
           

           

          1. <?xml version="1.0" encoding="UTF-8"?>    
          2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"    
          3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
          4. <hibernate-mapping package="pojo">    
          5.     <class name="Student" table="A_STUDENT" dynamic-insert="true" dynamic-update="true">    
          6.         <id name="id" column="ID" type="string">    
          7.             <generator class="uuid.hex"/>    
          8.         </id>  
          9.         <property name="name" column="NAME" type="string"/>  
          10.         <!-- 有了dynamic-insert="true",dynamic-update="true"就不需要update="false" insert="false"了     -->                                     
          11.         <!-- access : 設置直接以字段訪問                                                                  -->  
          12.         <!-- generated="always" : 在insert或update情況下,hibernate為表字段                                -->  
          13.         <!-- 生成默認值之后,會刷新實體類,把生成的默認值返回給實體類。                                       -->  
          14.         <!-- 注意,age上generated="insert"                                                               -->  
          15.         <property name="age"         column="AGE"        type="integer"  access="field" generated="insert"/>    
          16.         <property name="createTime" column="CREATETIME" type="calendar" access="field" generated="always"/>    
          17.         <property name="updateTime" column="UPDATETIME" type="calendar" access="field" generated="always"/>     
          18.     </class>    
          19. </hibernate-mapping>  
           

           

          1. package util;  
          2. import org.hibernate.Session;  
          3. import org.hibernate.Transaction;  
          4. import pojo.Student;  
          5. public class Manager {  
          6.     public static void main(String[] args) {  
          7.           
          8.         Student stu = new Student();  
          9.         stu.setName("fuhaidong");  
          10.           
          11.         Session session = HibernateUtil.getSessionFactory().openSession();  
          12.         Transaction transaction = session.beginTransaction();  
          13.           
          14.         session.save(stu);  
          15.         Student s = (Student) session.get(Student.class, "402881832b3dea91012b3dea925a0001");  
          16.         s.setName("dddd");  
          17.         transaction.commit();  
          18.         session.close();  
          19.           
          20.     }  
          21. }  
           

           

           

          輸出日志:

          1. Hibernate:   
          2.     select  
          3.         student0_.ID as ID0_0_,  
          4.         student0_.NAME as NAME0_0_,  
          5.         student0_.AGE as AGE0_0_,  
          6.         student0_.CREATETIME as CREATETIME0_0_,  
          7.         student0_.UPDATETIME as UPDATETIME0_0_   
          8.     from  
          9.         A_STUDENT student0_   
          10.     where  
          11.         student0_.ID=?  
          12. Hibernate:   
          13.     insert   
          14.     into  
          15.         A_STUDENT  
          16.         (NAME, ID)   
          17.     values  
          18.         (?, ?)  
          19. Hibernate:   
          20.     select  
          21.         student_.AGE as AGE0_,  
          22.         student_.CREATETIME as CREATETIME0_,  
          23.         student_.UPDATETIME as UPDATETIME0_   
          24.     from  
          25.         A_STUDENT student_   
          26.     where  
          27.         student_.ID=?  
          28. ------------上面插入數據后,三個列都被查詢用來刷新實體了。  
          29. Hibernate:   
          30.     update  
          31.         A_STUDENT   
          32.     set  
          33.         NAME=?   
          34.     where  
          35.         ID=?  
          36. Hibernate:   
          37.     select  
          38.         student_.CREATETIME as CREATETIME0_,  
          39.         student_.UPDATETIME as UPDATETIME0_   
          40.     from  
          41.         A_STUDENT student_   
          42.     where  
          43.         student_.ID=?  
          44. ------------更新數據后,只有聲明為generated="always"的列被查詢  
           

           


          最后要注意的是,數據庫表的age,createTime,updateTime字段上都要有默認值,或者有觸發器 ,不然上面所有例子的age,createTime,

          updateTime在表中的值都是null.

                描述的很通俗,所以轉自:http://blog.csdn.net/fhd001/article/details/5878498

          posted on 2013-02-28 09:55 紫蝶∏飛揚↗ 閱讀(4093) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 金华市| 花垣县| 汝州市| 宣城市| 星子县| 三河市| 毕节市| 临江市| 珠海市| 射洪县| 华亭县| 安新县| 左云县| 浦江县| 方城县| 大荔县| 华亭县| 化隆| 高雄市| 乌鲁木齐市| 衡水市| 汪清县| 西丰县| 崇礼县| 鹤庆县| 资兴市| 祁阳县| 苏尼特左旗| 山阳县| 尼玛县| 蒲江县| 卓资县| 曲水县| 达拉特旗| 盐池县| 九江县| 资源县| 西城区| 泰顺县| 永州市| 佛山市|