数据截断:日期时间值不正确:org.joda.time.DateTime
Data truncation: Incorrect datetime value: org.joda.time.DateTime
我在通过 Hibernate 将 DateTime
传递到我的插入查询时遇到 SQL 异常。
请找到我的 Java 代码,我试图通过 DateTime
:
claimGroupingHistory.setCreatedAt(new DateTime());
claimGroupMappingRepository.insertClaimGroupingHistory(claimGroupingHistory.getDealerCode(),
claimGroupingHistory.getCreatedAt(),
claimGroupingHistory.getCreatedBy());
我在系统输出时得到 DateTime
格式:2019-01-10T13:59:36.700+05:30
.
请找到我的插入查询
请发现我正在获取异常
2019-01-10 13:59:36,754 [http-9292-1] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper: 146 - Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x00\x16org.joda.time.DateTime\xB8<xdj[\xDD\xF9\x02\x00\x00xr\x00\x1Forg.joda.time.base.BaseDateTime\xFF\xFF\x' for column 'created_at' at row 1
2019-01-10 13:59:36,774 [http-9292-1] ERROR com.cat.pscs.api.controller.BaseController: 57 - Data Integrity Violation Exception : org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement
您应该在您的实体中使用以下注释 class 以保留 joda DateTime:
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime createdAt;
还要确保您的 class 路径中有 jadira-usertype-core.jar:
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>3.1.0.CR1</version>
</dependency>
为了帮助 hibernate
持久化 DateTime
到数据库,您应该在项目中使用 joda-time-hibernate
而不是 joda-time
。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time-hibernate</artifactId>
<version>1.4</version>
</dependency>
修改您的实体:
@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime createdAt;
请注意,版本 1.4 适用于 Hibernate 3.6。所以当你使用更高级别的休眠时更新joda-time-hibernate
。
备选方案:
在pom.xml
声明一个额外的依赖,可以支持joda-time
的持久化。
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.extended</artifactId>
<version>5.0.0.GA</version>
</dependency>
修改实体:
@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private DateTime createdAt;
我在通过 Hibernate 将 DateTime
传递到我的插入查询时遇到 SQL 异常。
请找到我的 Java 代码,我试图通过 DateTime
:
claimGroupingHistory.setCreatedAt(new DateTime());
claimGroupMappingRepository.insertClaimGroupingHistory(claimGroupingHistory.getDealerCode(),
claimGroupingHistory.getCreatedAt(),
claimGroupingHistory.getCreatedBy());
我在系统输出时得到 DateTime
格式:2019-01-10T13:59:36.700+05:30
.
请找到我的插入查询
请发现我正在获取异常
2019-01-10 13:59:36,754 [http-9292-1] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper: 146 - Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x00\x16org.joda.time.DateTime\xB8<xdj[\xDD\xF9\x02\x00\x00xr\x00\x1Forg.joda.time.base.BaseDateTime\xFF\xFF\x' for column 'created_at' at row 1
2019-01-10 13:59:36,774 [http-9292-1] ERROR com.cat.pscs.api.controller.BaseController: 57 - Data Integrity Violation Exception : org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement
您应该在您的实体中使用以下注释 class 以保留 joda DateTime:
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime createdAt;
还要确保您的 class 路径中有 jadira-usertype-core.jar:
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>3.1.0.CR1</version>
</dependency>
为了帮助 hibernate
持久化 DateTime
到数据库,您应该在项目中使用 joda-time-hibernate
而不是 joda-time
。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time-hibernate</artifactId>
<version>1.4</version>
</dependency>
修改您的实体:
@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime createdAt;
请注意,版本 1.4 适用于 Hibernate 3.6。所以当你使用更高级别的休眠时更新joda-time-hibernate
。
备选方案:
在pom.xml
声明一个额外的依赖,可以支持joda-time
的持久化。
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.extended</artifactId>
<version>5.0.0.GA</version>
</dependency>
修改实体:
@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private DateTime createdAt;