`

Hibernate中timestamp日期类型自动赋值且更新时不改变

阅读更多

最近做一个小项目,持久化层使用Hibernate

在User实体映射时遇到了一个小问题,自己做个记录

场景描述

User实体中有一个字段 regDate(注册日期),该属性声明成 java.sql.Timestamp类型,想在插入时自动更新该属性,但后期用户在修改个人信息时,也就是执行update操作,regDate 不更新

User实体:

public class User{

     private Integer id;
     private java.sql.Timestamp regDate;
     private String email;
     ....
     //get set 

}

  User.hbm.xml

<property name="regDate" type="java.sql.Timestamp" generated="insert" update="false" insert="false">
	<column name="regdate" sql-type="timestamp" ></column>
</property>

 创建测试类 测试

@Test
public void insertUser(){
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	IUserService userService = (IUserService) ac.getBean("userService");
		
	User user = new User();
	user.setEmail("aaa@qq.com");
	user.setNickname("IoC");
	user.setPassword(MD5Util.MD5("aaa"));
	userService.saveOrUpdateEntity(user);
}

 

 

问题:

新插入一个用户,没有问题,regDate 会自动更新成当前日期,但执行更新时 regDate值会跟着变

 

解决办法:


开始一直以为是实体映射出了问题,在网上搜,各有各的说法

标红的三个属性,试了好多种不同排列组合,还是不能实现想要的效果

这里随便复习一下这三个属性:

genarated:

never(默认):标明此属性值不是从数据库中生成, 也就是根本不用刷新实体类了。

insert:标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。也就是只在insert情况下才会刷新实体类。

always:标明此属性值在insert和update时都会被生成。也就是在insert,update情况下都会刷新实体类。

insert="false"   update="false":

设置字段为只读,该字段不会出现在 insert 和 update 语句中,也就是如下的效果

Hibernate: 

    update

        surveypark.users 

    set

        email=?,

        password=?,

        nickname=? 

    where

 

        id=?

update操作,没有更新regDate 该列,但查看数据库,regDate的值还是更新了,然后才想到是不是数据库表字段类型的特性?

 

小结:

1.hibernate生成mysql中的timestamp字段,可以通过配置

在mysql中有timestamp类型的日期格式,又叫时间戳,只要在一个表中创建了这样的时间戳,那么只要像其中插入数据就会自动在timestamp列中加入当前的时间。

而在通过hibernate的hbm2ddl工具生成数据库表时若只是配置为TYPE=“timestamp”,那么实际生成的是datatime类型的,而不是我们想要得到的timestamp类型。

想在数据库中生成timestamp类型,就必须指定 sql-type="timestamp"

     <property name="redDate" type="java.sql.Timestamp"  generated="never"> 

     <column name="regdate" sql-type="timestamp" default="CURRENT_TIMESTAMP"></column> 
     </property>

2.如果不想让生成的timestamp类型字段随着表中行的更新而更新

第一种(hibernate端设置)

可以在hbm.xml设置default="CURRENT_TIMESTAMP如:

     <property name="redDate" type="java.sql.Timestamp"  generated="never"> 

     <column name="regdate" sql-type="timestamp" default="CURRENT_TIMESTAMP"></column> 
     </property>

        同理如果想随着更新就设置为default="CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"

default属性必须加,加完以后再查看数据库表

`regdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

 

第二种(数据库端设置)

重新生成相应的表并且手动设置default为CURRENT_TIMESTAMP

 

总结一句话,该日期能不能自动插入,和数据表字段类型 是不是 timestamp 类型有关,update时同步更新不更新和 有没有 default值有关

就到这了,吃饭

 

 

 

分享到:
评论

相关推荐

    C#更新SQLServer中TimeStamp字段(时间戳)的方法

    主要介绍了C#更新SQLServer中TimeStamp字段(时间戳)的方法,涉及C#操作数据库字段的相关技巧,需要的朋友可以参考下

    Hibernate+中文文档

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记...

    oracle中TIMESTAMP与DATE比较

    oracle中TIMESTAMP与DATE比较

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate中文详细学习文档

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记...

    关于Hinbernate中TimeStamp类型字段处理的小例子

    NULL 博文链接:https://zhengkaifl.iteye.com/blog/734139

    Hibernate 中文 html 帮助文档

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2....

    MySQL timestamp自动更新时间分享

    MySQL也有默认值timestamp,但在MySQL中,不仅是插入就算是修改也会更新timestamp的值! 这样一来,就不是创建日期了,当作更新日期来使用比较好! 因此在MySQL中要记录创建日期还得使用datetime 然后使用NOW() 函数...

    spirng-boot 的时间类型(date、datetime、timestamp)的全局配置

    spirng-boot 的时间类型(date、datetime、timestamp)的全局配置, 以及mysql的时间字段如何设置。

    有关java中的Date,String,Timestamp之间的转化问题

    有关java中的Date,String,Timestamp之间的转化问题

    【源码阅读】 protobuf 中的 timestamp 包

    在 timestamppb 中 Timestamp 包含两个字段 seconds 表示秒 nanos 表示纳秒 message Timestamp { int64 seconds = 1; int32 nanos = 2; } timestamp.go path: github.com/golang/protobuf/ptypes/timestamp.go ...

    mysql 数据类型TIMESTAMP

    在mysql中timestamp数据类型是一个比较特殊的数据类型,他可以自动在你不使用程序更新情况下只要你更新了记录timestamp会自动更新时间 通常表中会有一个Create date 创建日期的字段,其它数据库均有默认值的选项。...

    MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数

    主要介绍了MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数,需要的朋友可以参考下

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    java中将string类型转换成timestamp类型

    不懂这块的看看啦,mysql中中四中时间类型之一的TimeStamp,在项目中的简单运用,如何将TimeStamp转换成自己需要的时间格式

    Hibernate注解详解.pdf

    Hibernate 注解 annotation 超级详细

    hibernate 教程

    Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 持久化枚举(Persistent enum)类型 5.2.4. 自定义值类型 5.2.5. 映射到"任意"(any)类型 5.3. SQL中引号包围...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate自动生成数据库表映射实体类

    case Types.TIMESTAMP: case Types.BINARY: typeInJava = "Calendar"; break; case Types.DECIMAL: typeInJava = "BigDecimal"; break; case Types.BIGINT: typeInJava = "BigInteger"; break; case ...

    timestamp 与日期时间互转的 C 语言实现

    纯 C 语言实现的日期时间和timestamp互转的 API 调用,可用于嵌入式。函数名极简单明了,无文档。

Global site tag (gtag.js) - Google Analytics