生成的和默认的属性值
如果类的一个特定属性有着数据库生成的值,通常在第一次插入实体行的时候。典型的数据库生成的值是创建的时间戳 , 还有其它默认值等.
每当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;
- }
- }
- <?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;
- }
- }
- <?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;
- }
- }
- <?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();
-
- }
- }
输出日志:
- 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.
描述的很通俗,所以转自:http://blog.csdn.net/fhd001/article/details/5878498
posted on 2013-02-28 09:55
紫蝶∏飛揚↗ 阅读(4066)
评论(0) 编辑 收藏 所属分类:
Hibernate