我有一个简单的CRUD应用程序。我使用Hibernate作为ORM框架,MySQL作为db。我在将我的一个实体保存或更新到 db 时遇到问题。此问题与将表单上输入的日期减去一天有关。因此,db.
中实体的日期字段不正确下面的代码片段:
数据库属性
#
# 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`)
)
道类
@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);
}
我可以在表单上创建一个全新的菜单或更新现有菜单的数据。之后,我提交表单,调用我的控制器方法并执行保存或更新操作.
在MenuDaoImpl
类菜单对象传递字段 date
的正确值。(示例我输入了值 21.07.2019(。但是在执行操作后saveOrUpdate()
条目保存在数据库中,值为 20.07.2019。每次增加 1 天对我来说不是解决方案。如何解决此问题?
听起来像是时区的问题。尝试使用休眠实用程序指定时区 (https://www.baeldung.com/hibernate-date-time(
session = HibernateUtil.getSessionFactory().withOptions()
.jdbcTimeZone(TimeZone.getTimeZone("UTC"))
.openSession();
或使用分区日期对象,如分区日期时间。