Spring Boot将数据保存到数据库1天

问题描述 投票:1回答:2

问题

我正在使用SpringBoot编写一个应用程序,使用hibernate将数据写入MySQL数据库。我使用thymeleaf从HTML表单获取实体的数据。当我将记录保存到数据库时,它们落后1天,所以2019-04-09成为2019-04-08。

到目前为止有效

到目前为止我找到的解决这个问题的唯一解决方案是将系统的时间更改为UTC,但显然对于我正在编写应用程序的人来说,这将有所不同。我在互联网上看过很多这方面的主题,但大部分时间都是使用JVM黑客修复的,如果可能的话,我想以适当的方式做到这一点。

让我感到困惑的是什么

我使用的java.time.LocalDate据说不使用时区,它将此日期保存到类型为“Date”的SQL数据库列。我尝试将我的数据库时区更改为UTC,但这似乎没有什么区别。唯一有所作为的是将我的窗口时间改为UTC。

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=UTC
spring.datasource.username=box
spring.datasource.password=box
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

Hibernate实体

@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "dataUmowy")
private LocalDate dataUmowy;

调节器

@SessionAttributes("ofwca")
@Controller
public class OfwcaController {

@Autowired
private OfwcaDao ofwcaDao;

@RequestMapping(value = "/panelOfwca/daneOfwca", method = RequestMethod.POST)
public String daneOfwca(Model model, @ModelAttribute("ofwca") Ofwca ofwca){

    ofwcaDao.save(ofwca);

    model.addAttribute("title", "Dane " + ofwca.getImie() + " " + ofwca.getNazwisko());
    model.addAttribute("ofwca", ofwca);
    return "panelOfwca/daneOfwca";
}

数据访问对象

@Transactional
@Repository
public interface OfwcaDao extends CrudRepository<Ofwca, Integer> {

public List<Ofwca> findAll();

public Ofwca findByIdOfwca(Integer idOfwca);

}

HTML表单

<form role="form" method="post" th:action="@{/panelOfwca/daneOfwca}" th:object="${ofwca}">

  <div class="form-group col-xs-4">
    <label for="dataUmowy">Data umowy</label>
    <input type="date" id="dataUmowy" th:field="*{dataUmowy}" class="form-control">
  </div>
</form>
java mysql hibernate spring-boot jvm
2个回答
1
投票

虽然我很长一段时间没有使用过Hibernate(特别是java.time),但是你的问题看起来与你的MySQL服务器需要UTC时区的“日期”和你的本地服务器运行的事实有关。 Europe/Berlin时区,(至少)UTC + 1。这意味着,任何日期,例如我想,2019-08-04是在前一天保存的(例如2019-07-04) - 这是因为时区之间有1-2小时的差异。

在大多数情况下,最好将没有时区的所有日期/时间值视为默认具有UTC时区。如果那是不可能的,那么您应该调整数据库设置以使用与Java应用程序相同的时区。

进一步阅读:


0
投票

我现在通过为hibernate(我的本地服务器所在的)使用不同的时区来解决我的问题但是我不确定将来将应用程序部署到云时它将如何运行。可能必须再次基于Web服务器更改参数。

serverTimezone=Europe/Berlin
© www.soinside.com 2019 - 2024. All rights reserved.