MYSQL 8 JPA 2.0 mysql 在 JPA 保存后将 1 秒添加到当前日期

Posted

技术标签:

【中文标题】MYSQL 8 JPA 2.0 mysql 在 JPA 保存后将 1 秒添加到当前日期【英文标题】:MYSQL 8 JPA 2.0 mysql adds 1 seconds to current date after JPA save 【发布时间】:2020-03-05 02:17:29 【问题描述】:

我将 mysql 版本从 5.5.40 迁移到 8.0.18。迁移后,我更改了驱动程序类的 By JBoss 6 数据源配置。

        <driver-class>com.mysql.cj.jdbc.Driver</driver-class>

我已将 mysql-connector-java-8.0.18 放入 lib 文件夹。然后我的应用程序毫无问题地部署到 Jboss 6。当我开始测试应用程序时,我发现了一些东西。关于模拟作业实体,我设置了 startDateTime 列 一个约会。模拟作业保存到数据库后,startDateTime 与我设置的不同。但是只有一秒的区别。例如,如果我将日期设置为 2019-11-08 15:20:12,则数据库将其存储为 2019-11-08 15:20:13。我不确定这与时区有关。但无论如何,我使用以下语句更改了 mysql 的时区。

SET GLOBAL time_zone = '+3:00';

 @Entity
@Table(name = "SIMULATION_JOB")
public class SimulationJob implements Serializable 
/**
 *
 */
       private static final long serialVersionUID = -1768265008703114922L;

public SimulationJob() 
    super();


@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "SimulationJobIdGen")
@Column(name = "ID")
private long id;
@Column(name = "NAME")
@NotNull
@Size(max = 50)
private String name;
@Column(name = "PRIORITY")
private int priority;
@ManyToOne
@JoinColumn(name = "OWNER_USER_ID")
private User ownerUser;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "CREATE_DATETIME")
private Date createDateTime;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "START_DATETIME")
private Date startDateTime;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "END_DATETIME")
private Date endDateTime;

【问题讨论】:

那些2019-11-08-15-20-122019-11-08-15-20-13. "datetime" 格式看起来很奇怪? MySQL 中的 2019-11-08 14:04:01 日期时间格式是一个有效的格式示例。 但我还需要几秒钟 “但我还需要秒数” 是的,我忘了在示例中添加秒数,我正好及时更新该评论.. 其实我把来自 SimpleDateFormatçMysql 的格式存储在 2019-11-08 15:20:13 " 例如,如果我将日期设置为 2019-11-08 15:20:12,数据库将其存储为 2019-11-08 15:20:13。我不确定这是与时区有关” 我只想更改在 SQL 查询中使用 MySQL 的 NOW() 的插入,但不确定如何执行此操作甚至可能使用 jpa .. 或者只是 alter 表与DEFAULT current_timestamp() 在该列上,不要在 jpa 中设置它。此外,我很长时间没有用 Java 编程,所以我不知道为什么会发生这种情况.. 【参考方案1】:

我猜这可能与时间戳的舍入有关。在 MySQL 5.6.4 之前,对小数秒(即毫秒)的处理有所不同。

另见:

https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

【讨论】:

我试图设置这个。但是没有用。SET @@sql_mode = sys.list_add(@@sql_mode, 'TIME_TRUNCATE_FRACTIONAL'); 您可以在定义架构时直接指定它:CREATE TABLE t1 (dt DATETIME(0)); 0 表示没有分数。 但是如果我不使用分数,它会四舍五入吗?问题总是在我设置的一秒基础上增加一秒。 然后尝试使用 6 位精度,这将保持所有微秒而不四舍五入。

以上是关于MYSQL 8 JPA 2.0 mysql 在 JPA 保存后将 1 秒添加到当前日期的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

JPA 2.0 Eclipse 链接

[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8

[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8

Spring Boot 最佳实践Spring Data JPA 操作 MySQL 8

使用 JPA 2.1、EclipseLink、JSF 2.0 的日志表