`
fanjf
  • 浏览: 298290 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

[转]hibernate之生成的和默认的属性值(使用generated刷新实体)

 
阅读更多

生成的和默认的属性值

 

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

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

 

[java] view plaincopy
  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] view plaincopy
  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:

 

[java] view plaincopy
  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] view plaincopy
  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":

 

[java] view plaincopy
  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] view plaincopy
  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>  

 

 

 

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

分享到:
评论

相关推荐

    Hibernate+中文文档

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...

    hibernate3.2中文文档(chm格式)

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...

    HibernateAPI中文版.chm

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...

    Hibernate 中文 html 帮助文档

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) ...

    Hibernate中文详细学习文档

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...

    自动生成mapper和dao工具Auto_Generated_Code

    这个工具不用向idea和eclipse在集成mybaitis的插件,直接在运行好把生成的pojo和mapper拷贝到项目中即可,使用方式首先把数据库链接配置到generatorConfig.xml后,cmd进入到这个文件夹下运行:java -jar mybatis-...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...

    hibernate 体系结构与配置 参考文档(html)

    数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) ...

    hibernate小程序源码

    -- Generated by MyEclipse Hibernate Tools. --&gt; &lt;hibernate-configuration&gt; &lt;property name="connection.username"&gt;scdd jdbc:oracle:thin:@10.30.166.72:1521:orcl org.hibernate.dialect.Oracle9...

    mysql5.7 生成列 generated column用法实例分析

    本文实例讲述了mysql5.7 生成列 generated column用法。分享给大家供大家参考,具体如下: 生成列的值是根据列定义中的表达式计算得出的。 mysql5.7支持两种类型的生成列: 1、virtual 生成列:当从表中读取记录时,...

    Hibernate参考文档

    5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) ...

    mybatis-generate-demo.zip

    使用命令行的方式自动生成实体类,mapper接口和xml文件使用命令行的方式自动生成实体类,mapper接口和xml文件使用命令行的方式自动生成实体类,mapper接口和xml文件使用命令行的方式自动生成实体类,mapper接口和xml...

    Customize the Code Generated by the Resources Designer_CS

    Customize the Code Generated by the Resources Designer_CS。

    create_generated_clock应用例

    create_generated_clock 是用来说明generated clock与source clock的相位(边沿)关系,同时根据source clock找到master clock以及source clock 和master clock的关系,最终会确定generated clock和master clock的...

    Opencv安装过程中使用的vgg_generated_120.i等额外文件

    Opencv安装过程中使用的vgg_generated_120.i等额外文件,本人亲测可用

    代码生成器自动生成DevExpress数据界面

    [原创] 基于动软代码生成器,自己做的2个模板,选择数据库的一个表(视图、...创建一个xtraform窗口后,把 #region Windows Form Designer generated code 的代码以及其后的代码删除,用代码生成器生成的脚本替换即可。

    vgg_generated_48,vgg_generated_64,vgg_generated_80,vgg_generated_120

    该文件是opencv计算机视觉库移植opencv,并在Linux系统下编译时所需要的几个文件

    ‘vgg_generated_120.i’and ‘boostdesc_bgm.i’No such file or directory.rar

    解决Opencv3.3.0编译contrib时报错:“vgg_generated_120.i”: No such file or directory和“boostdesc_bgm.i”: No such file or directory等问题。 将目录中boostdesc_bgm.i、boostdesc_bgm_bi.i、boostdesc_bgm_...

    hibernate.properties

    hibernate.properties # # Hibernate, Relational Persistence for Idiomatic Java # # License: GNU Lesser General Public License (LGPL), version 2.1 or later. # See the lgpl.txt file in the root directory...

    vgg_generated_48.i\vgg_generated_64.i\vgg_generated_80.i\vgg_generated_120.i

    vgg_generated,total 4 files,just for 3 marks,please download now!

Global site tag (gtag.js) - Google Analytics