生成的和默认的属性值
如果类的一个特定属性有着数据库生成的值,通常在第一次插入实体行的时候。典型的数据库生成的值是创建的时间戳 , 还有其它默认值等.
每当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.
相关推荐
4. **hibernate.default_schema** 和 **hibernate.default_catalog**:这两个属性用于指定默认的数据库模式和目录,它们会在生成的SQL中自动添加到表名前。 5. **hibernate.session_factory_name**:用于在JNDI中...
- 生成的映射 XML 文件中可能会包含一些默认属性,如 `catalog` 和 `schema`。 - 如果这些属性不适用于您的应用场景,建议将其删除。这通常是因为数据库设计往往先于 Hibernate 映射文件的设计。 通过以上步骤,...
Hibernate.jdbc.use_get_generated_keys 属性用于控制 Hibernate 是否使用 JDBC3 Prepared Statement 的生成键。 Hibernate.cfg.xml 文件中的配置属性对 Hibernate 的行为和性能产生了重要的影响。正确地配置这些...
7. `hibernate.jdbc.use_get_generated_keys`:在插入数据后,允许使用 JDBC 的 `getGeneratedKeys()` 方法获取自动生成的主键。 了解并正确配置这些属性对于实现高效、可靠的 Hibernate 应用至关重要。它们可以...
- **2.2.2.4 无注解之属性的默认值**:如果未使用注解,Hibernate 会按照默认规则进行映射。 - **2.2.3 映射主键属性** - 主键属性的映射可以通过 `@Id` 注解来完成,该注解还可以与 `@GeneratedValue` 配合使用以...
4. **hibernate.default_schema**和**hibernate.default_catalog**: 分别用于指定默认的数据库模式(schema)和目录(catalog),在生成的SQL语句中,Hibernate将它们附加到未完全限定的表名前。 5. **hibernate....
在Hibernate中,实体是与数据库表相对应的Java类,而注解则是用来标记这些实体类及其属性,以便于Hibernate理解和管理它们。本篇文章将深入探讨Hibernate中的实体注解,包括其中英文含义,并提供一些实用的例子。 1...
- **无注解之属性的默认值**:如果没有使用注解,Hibernate 会按照默认规则来处理属性的映射。 - **映射主键属性** - 使用 `@Id` 注解来标识主键属性。 - 可以使用 `@GeneratedValue` 来指定主键生成策略,如...
实体Bean是Hibernate中非常重要的概念之一,用于表示数据库中的表,并通过注解来映射其字段与数据库表中的列。 ##### 3.1 简介 实体Bean是表示数据库表的对象形式,在Hibernate中通过注解进行配置,可以实现对象与...
6. **自定义资源生成过程**:如果你的项目需要高度定制,可以创建自定义的`T4`模板或者使用MSBuild任务来替代默认的资源生成机制。这使得你能完全控制生成的代码。 标签“Resources”提示了讨论的核心内容,即资源...
- **生成的属性:** 使用`@Generated`注解生成属性值。 - **继承:** `@Inheritance`注解用于配置继承策略。 - **关于单个关联关系的注解:** - **延迟选项和获取模式:** `@Fetch`注解控制关联关系的加载方式。 -...
5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...
通常情况下,这些实体类会被 JPA 或 Hibernate 使用,并且带有 `@Entity`、`@Embeddable` 等注解。QueryDsl 的代码生成工具会扫描这些注解,然后根据实体类的结构来自动生成对应的 QModel。 ##### 2.2 方法 1. **...
本篇文章将详细解析Hibernate配置的相关属性,帮助你更好地理解和使用Hibernate。 1. **hibernate.dialect** 这个属性用于指定与你使用的特定关系数据库相匹配的Hibernate方言(Dialect)。方言是Hibernate与不同...
指定了SessionFactory打开的Session使用的默认实体表示模式,可以是`dynamic-map`、`dom4j`或`pojo`。 **9. hibernate.order_updates** 如果开启,Hibernate将按照主键顺序排序更新操作,有助于减少高并发环境下的...
5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...
5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings...
可以通过 `@Access` 注解来控制 Hibernate 访问实体属性的方式。 **2.4.3.2 公式** 使用 `@Formula` 注解来定义基于 SQL 表达式的属性。 **2.4.3.3 类型** 使用 `@Type` 注解来指定属性的数据类型。 **2.4.3.4 ...
5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) ...