hibernate之生成的和默认的属性值(使用generated刷新实体) .
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:
- 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;
- }
- }
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; } }
- <?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>
<?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:
- 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;
- }
- }
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; } }
- <?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>
<?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":
- 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;
- }
- }
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; } }
- <?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>
<?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>
- 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();
- }
- }
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(); } }
输出日志:
- 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"的列被查询
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刷新实体) .相关推荐
- antd 中的 table 组件设置 size 属性值为 small 后,表头背景色设置的解决方案
antd中的 table 组件的效果图: 默认size属性值是default : 当设置size="small" ; 表头的背景色没有了: 解决方案:在表格列里面设置 classN ...
- Hibernate讲解(三)-类映射文件中常用属性的了解
我们把User.hbm.xml加了一些扩展来说说常用的属性的含义: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernat ...
- Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件
建立好数据库后,点击一个键,代码就生成了,这实在是份十分惬意的事情,前面有介绍Hibernate Tools就可以生成代码,那么我们怎么利用它来生成代码呢. 下面就把详细步骤贴出来,同样,有图有真相. ...
- Jbox帮助文档,默认的属性含义
$.jBox() [*]函数原型: $.jBox(content, options); └ 或者 jBox(content, options); [*]参数说明: - content (string, ...
- Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c
2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...
- 使用hibernate自动生成数据库表
使用hibernate自动生成数据库表 使用hibernate自动生成数据库表在hibernate3.2以后有两种方式: 1,使用hbm.xml形式:2,使用注解的形式. 本文介绍第一种方式: IDE ...
- 用Hibernate Tools生成Hibernate Mapping映射文件
用Hibernate Tools生成Hibernate Mapping映射文件 Eclipse中要集成安装Hibernate Tools组件 如果没有,请查看:Eclipse juno 中安装 JBo ...
- ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格...
一.新建一个Web 控件库; 二.在WebCustomControl1.cs文件中编制如下代码: using System; using System.Web.UI; using System.Web ...
- android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...
最新文章
- 常用24个方法有效优化ASP.NET的性能
- 适合ipad的python编程软件-如何用iPad运行Python代码?
- liferay requestrequest和actionRequest用法
- FLASH ERASE:CHIP、BLOCK、SECTOR
- 导师没项目怎么办?不如看看这些
- SpringMVC学习--springmvc原理
- Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)...
- 电商直播数据的简单总结
- 常见边缘检测对比(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Canny算子)
- 批处理之for /r
- 秒杀系统设计要点总结
- 目录穿越及文件包含漏洞
- Oracle get、start、edit、spool命令,临时变量、已定义变量
- excel表格筛选某一列重复数据
- java毕业设计花漾网在线商城mybatis+源码+调试部署+系统+数据库+lw
- php网站怎么给文件设置颜色,配置区块和文件颜色
- 小猿圈Java讲师分享开发9年Java进阶大全
- 利用Photoshop通道制作BMP格式的透明图标
- 分享一款多线程磁力搜索工具-聚磁帮
- Java——StringUtils
热门文章
- 【数据结构与算法】之有关“跳跃游戏”的求解思路与示例算法
- python骚操作之——判断整数
- 【Qt】QModbusDataUnit类
- 【Linux】一步一步学Linux——kill命令(124)
- 【Linux】一步一步学Linux——ac命令(102)
- 【Tools】StarUML2.8工具安装和破解
- 三角网导线平差实例_导线测量平差实例
- html 整行选择状态,Layui表格选中指定行的radio单选框并滚动到该行的实现代码
- keepalived(6)——lvs和arrp集成操作(2)——完成
- selinux禁用后系统无法正常启动的问题