gpt4 book ai didi

mysql - 使用 hibernate 保存或更新包含日期字段的实体的操作会减去一天

转载 作者:行者123 更新时间:2023-11-29 15:45:15 25 4
gpt4 key购买 nike

我有一个简单的 CRUD 应用程序。我使用 Hibernate 作为 ORM 框架,使用 MySQL 作为数据库。我在保存或更新我的实体之一到数据库时遇到问题。此问题涉及将表单上输入的日期减去一天。所以数据库中实体的日期字段不正确。
代码片段如下:

数据库属性

#
# JDBC connection properties
#
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hb_restaurants?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
jdbc.user=root
jdbc.password=root

#
# Connection pool properties
#
connection.pool.initialPoolSize=5
connection.pool.minPoolSize=5
connection.pool.maxPoolSize=20
connection.pool.maxIdleTime=30000

#
# Hibernate properties
#
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.packagesToScan=ru.icoltd.rvs.entity

实体类

  @Entity
@Table(name = "menus")
public class Menu {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@NotNull
@Column(name = "name")
private String name;

@Column(name = "date")
private LocalDate date;

@ManyToOne(cascade = {
CascadeType.DETACH, CascadeType.MERGE,
CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "restaurant_id")
private Restaurant restaurant;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "menu", cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
private List<Dish> dishes;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "menu", cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
private List<Vote> votes;

// getters and setters

表格

CREATE TABLE `menus`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`restaurant_id` int(11) DEFAULT NULL,
`date` date DEFAULT NULL,
KEY `fk_restaurant_idx` (`restaurant_id`),
CONSTRAINT `fk_restaurant_id` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
PRIMARY KEY (`id`)
)

Dao类

@Repository
@Slf4j
public class MenuDAOImpl implements MenuDAO {

private SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
public void saveMenu(Menu menu) {
Session currentSession = sessionFactory.getCurrentSession();
currentSession.saveOrUpdate(menu);
}

我可以创建一个全新的菜单或更新表单上现有菜单的数据。之后,我提交表单,我的 Controller 方法被调用并执行保存或更新操作。
MenuDaoImpl 类菜单对象中,传递了字段 date 的正确值。(例如,我输入了值 21.07.2019)。但执行操作 saveOrUpdate() 后,条目将保存在数据库中,值为 20.07.2019。每次增加 1 天对我来说不是一个解决方案。我该如何解决这个问题?

最佳答案

听起来像是时区问题。尝试使用 hibernate-utils 指定时区 ( https://www.baeldung.com/hibernate-date-time )

session = HibernateUtil.getSessionFactory().withOptions()
.jdbcTimeZone(TimeZone.getTimeZone("UTC"))
.openSession();

或使用分区日期对象,例如 ZonedDateTime。

关于mysql - 使用 hibernate 保存或更新包含日期字段的实体的操作会减去一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57132021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com