随笔-9  评论-168  文章-266  trackbacks-0

生成的和默认的属性值

 

如果类的一个特定属性有着数据库生成的值,通常在第一次插入实体行的时候。典型的数据库生成的值是创建的时间戳 , 还有其它默认值等.      

每当hibernate给定义了已生成或默认属性的实体执行sql insert或update时,它在插入默认值或生成值之后立即执行select。因为设置了generated=always,hibernate会在插入后自动的执行一个select,给java类中的属性设置,如果没有设置generated属性,需要显式调用session.flush()语句。这里就是说, 数据库默认生成值的字段,必须通过select后把值传给java实体的该属性。

使用property映射中的generated开关启用这个自动刷新:

标记为数据库生成的属性还必须是非可插入和非可更新的,用insert和update属性进行控制它们。如果两者都设置为false,属性的列就永远不会出现在insert或者update语句中---属性值是只读的。而且,通常不在类中给不可变的属性添加公有的设置方法(这时应切换到字段访问).

 

关于generated=""的适用值说明:

never(默认):标明此属性值不是从数据库中生成, 也就是根本不用刷新实体类了。

insert:标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。也就是只在insert情况下才会刷新实体类。

always:标明此属性值在insert和update时都会被生成。也就是在insert,update情况下都会刷新实体类。

 

例1:

[java] 
  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. }  
 

 

[xhtml]
  1. xml version="1.0" encoding="utf-8"?>    
  2.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  3. <hibernate-mapping package="pojo">    
  4.     <class name="student" table="a_student">    
  5.         <id name="id" column="id" type="string">    
  6.             <generator class="uuid.hex"/>    
  7.         id>  
  8.         <property name="name" column="name" type="string"/>  
  9.           
  10.           
  11.           
  12.           
  13.         <property name="age" column="age" type="integer" insert="false" update="false"   
  14.             access="field" generated="always"/>    
  15.         <property name="createtime" column="createtime" type="calendar" insert="false"   
  16.             update="false" access="field" generated="always"/>    
  17.         <property name="updatetime" column="updatetime" type="calendar" insert="false"   
  18.             update="false" access="field" generated="always"/>     
  19.     class>    
  20. hibernate-mapping>  

 

 

例2:

[java]
  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. }  

 

[xhtml]
  1. xml version="1.0" encoding="utf-8"?>    
  2.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  3. <hibernate-mapping package="pojo">    
  4.     <class name="student" table="a_student" dynamic-insert="true" dynamic-update="true">    
  5.         <id name="id" column="id" type="string">    
  6.             <generator class="uuid.hex"/>    
  7.         id>  
  8.         <property name="name" column="name" type="string"/>  
  9.                                              
  10.           
  11.           
  12.           
  13.         <property name="age"         column="age"        type="integer"  access="field" generated="always"/>    
  14.         <property name="createtime" column="createtime" type="calendar" access="field" generated="always"/>    
  15.         <property name="updatetime" column="updatetime" type="calendar" access="field" generated="always"/>     
  16.     class>    
  17. hibernate-mapping>  

 

因为有了dynamic-insert="true" dynamic-update="true", 那么没有设值的属性(age,createtime,updatetime)就不会出现在insert,update的数据库执行语句中,所以也就没有必要在各属性上使用insert="false" update="false"。

 

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

[java] 
  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. }  
 

 

[xhtml] 
  1. xml version="1.0" encoding="utf-8"?>    
  2.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  3. <hibernate-mapping package="pojo">    
  4.     <class name="student" table="a_student" dynamic-insert="true" dynamic-update="true">    
  5.         <id name="id" column="id" type="string">    
  6.             <generator class="uuid.hex"/>    
  7.         id>  
  8.         <property name="name" column="name" type="string"/>  
  9.                                              
  10.           
  11.           
  12.           
  13.           
  14.         <property name="age"         column="age"        type="integer"  access="field" generated="insert"/>    
  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>  
 

 

[java] 
  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. }  
 

 

 

输出日志:

[java] 
  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 紫蝶∏飛揚↗ 阅读(3994) 评论(0)  编辑  收藏 所属分类: hibernate
网站地图