http://blog.csdn.net/fhd001/article/details/5878498

生成的和默认的属性值

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

每当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:firstline[1]] view plaincopyprint?
  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. public String getId() {
  14. return id;
  15. }
  16. @SuppressWarnings("unused")
  17. private void setId(String id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public Calendar getCreateTime() {
  30. return createTime;
  31. }
  32. public Calendar getUpdateTime() {
  33. return updateTime;
  34. }
  35. }

package pojo; import java.io.Serializable; import java.util.Calendar; public class Student implements Serializable{ private String id; private String name; //删除age的公共设置方法 private int age; //删除createTime的公共设置方法 private Calendar createTime; //删除updateTime的公共设置方法 private Calendar updateTime; public String getId() { return id; } @SuppressWarnings("unused") private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public Calendar getCreateTime() { return createTime; } public Calendar getUpdateTime() { return updateTime; } }

[xhtml:firstline[1]] view plaincopyprint?
  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>

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pojo"> <class name="Student" table="A_STUDENT"> <id name="id" column="ID" type="string"> <generator class="uuid.hex"/> </id> <property name="name" column="NAME" type="string"/> <!-- insert="false",update="false" : 设置属性为只读, 该字段不会出现在insert,update中。 --> <!-- access : 设置直接以字段访问 --> <!-- generated="always" : 在insert或update情况下,hibernate为表字段生成默认值之后,会刷新实体类,把生成的 --> <!-- 默认值返回给实体类。 --> <property name="age" column="AGE" type="integer" insert="false" update="false" access="field" generated="always"/> <property name="createTime" column="CREATETIME" type="calendar" insert="false" update="false" access="field" generated="always"/> <property name="updateTime" column="UPDATETIME" type="calendar" insert="false" update="false" access="field" generated="always"/> </class> </hibernate-mapping>

例2:

[java:firstline[1]] view plaincopyprint?
  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. public String getId() {
  14. return id;
  15. }
  16. @SuppressWarnings("unused")
  17. private void setId(String id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public Calendar getCreateTime() {
  30. return createTime;
  31. }
  32. public Calendar getUpdateTime() {
  33. return updateTime;
  34. }
  35. }

package pojo; import java.io.Serializable; import java.util.Calendar; public class Student implements Serializable{ private String id; private String name; //删除age的公共设置方法 private int age; //删除createTime的公共设置方法 private Calendar createTime; //删除updateTime的公共设置方法 private Calendar updateTime; public String getId() { return id; } @SuppressWarnings("unused") private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public Calendar getCreateTime() { return createTime; } public Calendar getUpdateTime() { return updateTime; } }

[xhtml:firstline[1]] view plaincopyprint?
  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>

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pojo"> <class name="Student" table="A_STUDENT" dynamic-insert="true" dynamic-update="true"> <id name="id" column="ID" type="string"> <generator class="uuid.hex"/> </id> <property name="name" column="NAME" type="string"/> <!-- 有了dynamic-insert="true",dynamic-update="true"就不需要update="false" insert="false"了 --> <!-- access : 设置直接以字段访问 --> <!-- generated="always" : 在insert或update情况下,hibernate为表字段 --> <!-- 生成默认值之后,会刷新实体类,把生成的默认值返回给实体类。 --> <property name="age" column="AGE" type="integer" access="field" generated="always"/> <property name="createTime" column="CREATETIME" type="calendar" access="field" generated="always"/> <property name="updateTime" column="UPDATETIME" type="calendar" access="field" generated="always"/> </class> </hibernate-mapping>

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

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

[java:firstline[1]] view plaincopyprint?
  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. public String getId() {
  14. return id;
  15. }
  16. @SuppressWarnings("unused")
  17. private void setId(String id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public Calendar getCreateTime() {
  30. return createTime;
  31. }
  32. public Calendar getUpdateTime() {
  33. return updateTime;
  34. }
  35. }

package pojo; import java.io.Serializable; import java.util.Calendar; public class Student implements Serializable{ private String id; private String name; //删除age的公共设置方法 private int age; //删除createTime的公共设置方法 private Calendar createTime; //删除updateTime的公共设置方法 private Calendar updateTime; public String getId() { return id; } @SuppressWarnings("unused") private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public Calendar getCreateTime() { return createTime; } public Calendar getUpdateTime() { return updateTime; } }

[xhtml:firstline[1]] view plaincopyprint?
  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>

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pojo"> <class name="Student" table="A_STUDENT" dynamic-insert="true" dynamic-update="true"> <id name="id" column="ID" type="string"> <generator class="uuid.hex"/> </id> <property name="name" column="NAME" type="string"/> <!-- 有了dynamic-insert="true",dynamic-update="true"就不需要update="false" insert="false"了 --> <!-- access : 设置直接以字段访问 --> <!-- generated="always" : 在insert或update情况下,hibernate为表字段 --> <!-- 生成默认值之后,会刷新实体类,把生成的默认值返回给实体类。 --> <!-- 注意,age上generated="insert" --> <property name="age" column="AGE" type="integer" access="field" generated="insert"/> <property name="createTime" column="CREATETIME" type="calendar" access="field" generated="always"/> <property name="updateTime" column="UPDATETIME" type="calendar" access="field" generated="always"/> </class> </hibernate-mapping>

[java:firstline[1]] view plaincopyprint?
  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. Student stu = new Student();
  8. stu.setName("fuhaidong");
  9. Session session = HibernateUtil.getSessionFactory().openSession();
  10. Transaction transaction = session.beginTransaction();
  11. session.save(stu);
  12. Student s = (Student) session.get(Student.class, "402881832b3dea91012b3dea925a0001");
  13. s.setName("dddd");
  14. transaction.commit();
  15. session.close();
  16. }
  17. }

package util; import org.hibernate.Session; import org.hibernate.Transaction; import pojo.Student; public class Manager { public static void main(String[] args) { Student stu = new Student(); stu.setName("fuhaidong"); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); session.save(stu); Student s = (Student) session.get(Student.class, "402881832b3dea91012b3dea925a0001"); s.setName("dddd"); transaction.commit(); session.close(); } }

输出日志:

[java:firstline[1]] view plaincopyprint?
  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"的列被查询

Hibernate: select student0_.ID as ID0_0_, student0_.NAME as NAME0_0_, student0_.AGE as AGE0_0_, student0_.CREATETIME as CREATETIME0_0_, student0_.UPDATETIME as UPDATETIME0_0_ from A_STUDENT student0_ where student0_.ID=? Hibernate: insert into A_STUDENT (NAME, ID) values (?, ?) Hibernate: select student_.AGE as AGE0_, student_.CREATETIME as CREATETIME0_, student_.UPDATETIME as UPDATETIME0_ from A_STUDENT student_ where student_.ID=? ------------上面插入数据后,三个列都被查询用来刷新实体了。 Hibernate: update A_STUDENT set NAME=? where ID=? Hibernate: select student_.CREATETIME as CREATETIME0_, student_.UPDATETIME as UPDATETIME0_ from A_STUDENT student_ where student_.ID=? ------------更新数据后,只有声明为generated="always"的列被查询


最后要注意的是,数据库表的age,createTime,updateTime字段上都要有默认值,或者有触发器 ,不然上面所有例子的age,createTime,

updateTime在表中的值都是null.

hibernate之生成的和默认的属性值(使用generated刷新实体) .相关推荐

  1. antd 中的 table 组件设置 size 属性值为 small 后,表头背景色设置的解决方案

    antd中的 table 组件的效果图: 默认size属性值是default : 当设置size="small" ; 表头的背景色没有了: 解决方案:在表格列里面设置 classN ...

  2. Hibernate讲解(三)-类映射文件中常用属性的了解

    我们把User.hbm.xml加了一些扩展来说说常用的属性的含义: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernat ...

  3. Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件

    建立好数据库后,点击一个键,代码就生成了,这实在是份十分惬意的事情,前面有介绍Hibernate Tools就可以生成代码,那么我们怎么利用它来生成代码呢. 下面就把详细步骤贴出来,同样,有图有真相. ...

  4. Jbox帮助文档,默认的属性含义

    $.jBox() [*]函数原型: $.jBox(content, options); └ 或者 jBox(content, options); [*]参数说明: - content (string, ...

  5. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c

    2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...

  6. 使用hibernate自动生成数据库表

    使用hibernate自动生成数据库表 使用hibernate自动生成数据库表在hibernate3.2以后有两种方式: 1,使用hbm.xml形式:2,使用注解的形式. 本文介绍第一种方式: IDE ...

  7. 用Hibernate Tools生成Hibernate Mapping映射文件

    用Hibernate Tools生成Hibernate Mapping映射文件 Eclipse中要集成安装Hibernate Tools组件 如果没有,请查看:Eclipse juno 中安装 JBo ...

  8. ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格...

    一.新建一个Web 控件库; 二.在WebCustomControl1.cs文件中编制如下代码: using System; using System.Web.UI; using System.Web ...

  9. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...

    本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...

最新文章

  1. 常用24个方法有效优化ASP.NET的性能
  2. 适合ipad的python编程软件-如何用iPad运行Python代码?
  3. liferay requestrequest和actionRequest用法
  4. FLASH ERASE:CHIP、BLOCK、SECTOR
  5. 导师没项目怎么办?不如看看这些
  6. SpringMVC学习--springmvc原理
  7. Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)...
  8. 电商直播数据的简单总结
  9. 常见边缘检测对比(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Canny算子)
  10. 批处理之for /r
  11. 秒杀系统设计要点总结
  12. 目录穿越及文件包含漏洞
  13. Oracle get、start、edit、spool命令,临时变量、已定义变量
  14. excel表格筛选某一列重复数据
  15. java毕业设计花漾网在线商城mybatis+源码+调试部署+系统+数据库+lw
  16. php网站怎么给文件设置颜色,配置区块和文件颜色
  17. 小猿圈Java讲师分享开发9年Java进阶大全
  18. 利用Photoshop通道制作BMP格式的透明图标
  19. 分享一款多线程磁力搜索工具-聚磁帮
  20. Java——StringUtils

热门文章

  1. 【数据结构与算法】之有关“跳跃游戏”的求解思路与示例算法
  2. python骚操作之——判断整数
  3. 【Qt】QModbusDataUnit类
  4. 【Linux】一步一步学Linux——kill命令(124)
  5. 【Linux】一步一步学Linux——ac命令(102)
  6. 【Tools】StarUML2.8工具安装和破解
  7. 三角网导线平差实例_导线测量平差实例
  8. html 整行选择状态,Layui表格选中指定行的radio单选框并滚动到该行的实现代码
  9. keepalived(6)——lvs和arrp集成操作(2)——完成
  10. selinux禁用后系统无法正常启动的问题