【发布时间】:2017-01-11 14:30:00
【问题描述】:
我现在遇到了一个奇怪的问题。当我将今天的日期插入数据库时,它会映射到昨天的日期,每个日期都会发生。例如,当我尝试插入 2016-09-02 时,数据库将其保存为 2016-09-01。 这是我的映射:
@DateTimeFormat(pattern="dd/MM/yyyy")
@Column(name = "OrderDate", nullable = false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private final LocalDate orderDate;
我通过new LocalDate() 创建实例
我尝试在将值保存到数据库之前在控制台上打印它并正确打印它,但数据库中的值来自前一天:/
所以问题要么出在休眠映射上,要么出在mysql上。
我用这种方法将日期保存到数据库中:
@Autowired
private SessionFactory sessionFactory;
public void persist(T entity) {
getSession().persist(entity);
}
我什至不知道是hibernate的问题,还是mysql的问题。这真的很奇怪。你能给我任何指示什么可能是错的吗?提前致谢 我使用的mysql版本:5.7.14-log
编辑:当我像这样在 mysql 中手动插入数据时:
insert into Orders values (149,14,'2016-09-03','2016-09-03',199.99)
日期保存正确
我的 sql 设置: http://pastebin.com/87d6pkmE
我开启了登录mysql,mysql处理的代码是:
2016-09-03T19:54:06.016215Z 125 Connect root@localhost on ElectronicsStoreDB using TCP/IP
2016-09-03T19:54:06.017215Z 125 Query /* mysql-connector-java-6.0.3 ( Revision: 9fb85a76ccb7506157e668f1516464a46e317d4a ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout
2016-09-03T19:54:06.018215Z 125 Query SET character_set_results = NULL
2016-09-03T19:54:06.018215Z 125 Query SET autocommit=1
2016-09-03T19:54:06.018215Z 125 Query SET autocommit=0
2016-09-03T19:54:06.021216Z 125 Query select product0_.ProductID as ProductI1_4_0_, product0_.Category as Category2_4_0_, product0_.Description as Descript3_4_0_, product0_.Discontinued as Disconti4_4_0_, product0_.Manufacturer as Manufact5_4_0_, product0_.Name as Name6_4_0_, product0_.UnitPrice as UnitPric7_4_0_, product0_.UnitsInStock as UnitsInS8_4_0_ from Products product0_ where product0_.ProductID=19
2016-09-03T19:54:06.045217Z 125 Query insert into Orders (CustomerID, OrderDate, ShippingDate, TotalPrice) values (14, '2016-09-02', '2016-09-02', 437.99)
2016-09-03T19:54:06.048217Z 125 Query insert into OrderDetails (OrderID, ProductID, Quantity, UnitPrice) values (163, 19, 1, 437.99)
2016-09-03T19:54:06.091220Z 125 Query update Products set Category='Printer', Description='USB 2.0, Wi-Fi', Discontinued=0, Manufacturer='EPSON', Name='XP-610', UnitPrice=437.99, UnitsInStock=134 where ProductID=19
2016-09-03T19:54:06.092220Z 125 Query commit
2016-09-03T19:54:06.094220Z 125 Query SET autocommit=1
2016-09-03T19:54:06.095220Z 125 Query select @@session.tx_read_only
2016-09-03T19:54:06.095220Z 125 Quit
所以日期是错误的
找到了类似的线程,但它并没有真正帮助:
dates consistently two days off
我正在使用jdbc.driverClassName=com.mysql.cj.jdbc.Driver
【问题讨论】:
-
你的时区是多少?如果您在
UTC的积极方面,则2016-09-02的日期将是2016-09-01inUTC+0。 -
听起来像 Kayaman 正在做某事。是否值得打开/配置 Hibernate 的日志输出以查看正在生成什么 SQL? mkyong.com/hibernate/…
-
我没有在任何地方设置时区,我的时区是 UTC+01:00 但是,我到数据库的 jdbc url 如下所示:jdbc:mysql://localhost:3306/ElectronicsStoreDB?useUnicode=true&useJDBCCompliantTimezoneShift =true&useLegacyDatetimeCode=false&serverTimezone=UTC
-
这不是我见过的第一个此类问题(但我找不到合适的副本),但我敢赌甜甜圈它与时区有关。我不熟悉你设置的 MySQL 选项,所以我不能告诉你我脑海中的问题。
-
我用我的 sql 设置更新了帖子,希望对你有帮助:(
标签: java mysql spring hibernate jodatime