生成的和默認的屬性值
如果類的一個特定屬性有著數據庫生成的值,通常在第一次插入實體行的時候。典型的數據庫生成的值是創建的時間戳 , 還有其它默認值等.
每當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