最近做一个小项目,持久化层使用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#编程中,SQL Server的时间戳(TimeStamp)字段是一个特殊的数据类型,它与我们通常理解的日期时间无关,而是用来记录数据行的版本或更改信息。本文将深入探讨如何在C#中读取和更新SQL Server中的Timestamp字段。...
总结,理解Hibernate中Timestamp类型的处理,包括其映射、自动更新、转换以及性能优化,是提升Java数据库应用开发效率的关键。通过实际的代码示例,开发者可以更好地掌握这些概念,并将其应用于实际项目中。
在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...
此外,MySQL允许在一个表中最多定义两个自动更新的`TIMESTAMP`字段,其中一个可以设置为`CURRENT_TIMESTAMP`作为默认值,另一个可以设置为`ON UPDATE CURRENT_TIMESTAMP`,这样在插入新行或更新行时,这两个字段都会...
Spring Boot提供了一种方便的方式来全局配置日期和时间类型,包括date、datetime和timestamp,这使得与数据库交互时能够更加便捷地处理时间数据。本篇文章将深入探讨Spring Boot如何进行时间类型的全局配置,以及...
其次,对于复杂的数据类型,如日期和时间,Java的Date和Calendar类在Hibernate中可以映射为java.sql.Date、java.sql.Time或java.sql.Timestamp。对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、...
- **日期时间类型**:`java.util.Date` 和 `java.sql.Date` 对应于 `DATE`,`java.util.Date` 和 `java.sql.Time` 映射为 `TIME`,而 `java.util.Date`、`java.sql.Timestamp` 和 `java.util.Calendar` 则映射到 `...
在这个例子中,`createdAt`字段会在用户对象被首次保存到数据库时自动设置,而`updatedAt`字段则会在每次对象被更新时自动更新。这样的设计可以帮助我们轻松地追踪每个用户的创建时间和最近修改时间。 时间戳的应用...
在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...
- `@Temporal`:用于处理日期时间类型的字段,有TemporalType.DATE、TemporalType.TIME和TemporalType.TIMESTAMP三种类型。 - `@OneToMany`、`@ManyToOne`、`@OneToOne`、`@ManyToMany`:表示不同类型的关联关系,...
5. **布尔型**:BOOLEAN在数据库中表示True/False,Hibernate对应的Java类型是`java.lang.Boolean`。 6. **二进制数据**:BINARY、VARBINARY、BLOB。这通常用于存储图片或大文件,Hibernate用`byte[]`或`org.spring...
Timestamp类型可以存储年、月、日、时、分、秒等信息,并且可以与数据库中的时间戳类型相匹配。 下面是一个将String类型转换成Timestamp类型的示例代码: ``` DateFormat format = new SimpleDateFormat("yyyy-MM-...
当我们在使用Hibernate时,我们需要了解Java数据类型如何与SQL数据类型对应,以便正确地配置实体类和Hibernate的映射文件(通常是.hbm.xml文件或使用注解的方式)。例如,Java的`int`类型通常对应于SQL的`INTEGER`,...
Hibernate 是一款非常流行的 Java 持久化框架,它通过提供一种对象关系映射 (ORM) 技术,允许开发者将 Java 对象模型与关系型数据库进行无缝连接。在 Hibernate 中使用注解可以极大地提高开发效率,减少配置工作量,...
在Hibernate中,实体对象的标识(ID)通常由框架自动生成,以确保唯一性。ID生成策略可以通过`<id>`元素配置,例如: ```xml ``` 在这里,`name`属性指定了实体类中的ID字段名称,`type`属性指定了ID字段的...
MySQL中的timestamp类型是一种用于存储时间戳的字段类型,它可以记录日期和时间的精确值。在讨论MySQL timestamp自动更新时间的功能时,我们需要注意以下关键知识点: 1. **timestamp默认值**: - MySQL允许你在...
Java 中的日期和时间处理是编程中非常重要的一方面,Date、String 和 Timestamp 是三种常用的日期和时间类型,本文将详细介绍它们之间的转换问题。 一、获取系统当前时间 在 Java 中,可以使用以下三种方法来获取...
8. @Temporal:用于日期时间类型的字段,指定存储类型(TIMESTAMP、DATE、TIME)。 三、Hibernate工作流程 1. 加载SessionFactory:根据Hibernate配置文件创建SessionFactory对象。 2. 创建Session:通过...
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 标记...