<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    生成的和默認的屬性值

     

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

    每當(dāng)hibernate給定義了已生成或默認屬性的實體執(zhí)行SQL INSERT或UPDATE時,它在插入默認值或生成值之后立即執(zhí)行SELECT。因為設(shè)置了generated=always,hibernate會在插入后自動的執(zhí)行一個select,給Java類中的屬性設(shè)置,如果沒有設(shè)置generated屬性,需要顯式調(diào)用session.flush()語句。這里就是說, 數(shù)據(jù)庫默認生成值的字段,必須通過select后把值傳給java實體的該屬性。

    使用property映射中的generated開關(guān)啟用這個自動刷新:

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

    標(biāo)記為數(shù)據(jù)庫生成的屬性還必須是非可插入和非可更新的,用insert和update屬性進行控制它們。如果兩者都設(shè)置為false,屬性的列就永遠不會出現(xiàn)在INSERT或者UPDATE語句中---屬性值是只讀的。而且,通常不在類中給不可變的屬性添加公有的設(shè)置方法(這時應(yīng)切換到字段訪問).

     

    關(guān)于generated=""的適用值說明:

    never(默認):標(biāo)明此屬性值不是從數(shù)據(jù)庫中生成, 也就是根本不用刷新實體類了。

    insert:標(biāo)明此屬性值在insert的時候生成,但是不會在隨后的update時重新生成。也就是只在insert情況下才會刷新實體類。

    always:標(biāo)明此屬性值在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的公共設(shè)置方法  
    8.     private int age;  
    9.     //刪除createTime的公共設(shè)置方法  
    10.     private Calendar createTime;  
    11.     //刪除updateTime的公共設(shè)置方法  
    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" : 設(shè)置屬性為只讀, 該字段不會出現(xiàn)在insert,update中。                    -->  
    11.         <!-- access : 設(shè)置直接以字段訪問                                                                          -->  
    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的公共設(shè)置方法  
    8.     private int age;  
    9.     //刪除createTime的公共設(shè)置方法  
    10.     private Calendar createTime;  
    11.     //刪除updateTime的公共設(shè)置方法  
    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 : 設(shè)置直接以字段訪問                                                                  -->  
    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", 那么沒有設(shè)值的屬性(age,createTime,updateTime)就不會出現(xiàn)在insert,update的數(shù)據(jù)庫執(zhí)行語句中,所以也就沒有必要在各屬性上使用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的公共設(shè)置方法  
    8.     private int age;  
    9.     //刪除createTime的公共設(shè)置方法  
    10.     private Calendar createTime;  
    11.     //刪除updateTime的公共設(shè)置方法  
    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 : 設(shè)置直接以字段訪問                                                                  -->  
    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. ------------上面插入數(shù)據(jù)后,三個列都被查詢用來刷新實體了。  
    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. ------------更新數(shù)據(jù)后,只有聲明為generated="always"的列被查詢  
     

     


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

    updateTime在表中的值都是null.

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

    posted on 2013-02-28 09:55 紫蝶∏飛揚↗ 閱讀(4094) 評論(0)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 91成人免费观看| 77777亚洲午夜久久多人| a毛片免费全部播放完整成| 亚洲AV无码国产剧情| 亚洲手机中文字幕| 亚洲AV无码乱码国产麻豆 | 亚洲综合无码精品一区二区三区| 免费一本色道久久一区| 日韩免费无码一区二区三区 | 亚洲精品视频在线观看你懂的| 美女被cao免费看在线看网站| 日本不卡免费新一区二区三区| 一级毛片视频免费观看| 久久精品国产亚洲AV| 亚洲综合色丁香婷婷六月图片 | 日韩欧毛片免费视频| 黄页网站在线看免费| 日韩精品在线免费观看| 久久精品免费大片国产大片| 亚洲Av永久无码精品黑人| 亚洲日韩中文字幕无码一区| 亚洲剧情在线观看| 亚洲精品成人久久| 久久精品蜜芽亚洲国产AV| 亚洲一区二区成人| 亚洲欧洲春色校园另类小说| 亚洲欧洲自拍拍偷综合| 亚洲黄色在线播放| 亚洲成AV人综合在线观看| 亚洲综合男人的天堂色婷婷| 97亚洲熟妇自偷自拍另类图片| 久久噜噜噜久久亚洲va久| 亚洲精选在线观看| 亚洲系列国产精品制服丝袜第| 亚洲精品欧洲精品| 久久精品国产99国产精品亚洲| 国产成人精品日本亚洲18图| 亚洲熟妇AV一区二区三区宅男| 日韩欧美亚洲中文乱码| 大片免费观看92在线视频线视频| 国产精品免费大片一区二区|