Springboot сохраняет дату в базе данных 1 выходной - PullRequest
1 голос
/ 06 апреля 2019

Проблема

Я пишу приложение с помощью SpringBoot, используя режим гибернации при записи данных в базу данных MySQL.Я получаю данные для сущности из формы HTML, используя тимилиф.Когда я сохраняю записи в базе данных, они отстают на 1 день, поэтому 2019-04-09 становится 2019-04-08.

То, что работало до сих пор

Единственное решение, которое я обнаружил до сих пор, - это изменить время, в течение которого моя система находится в UTC, но, очевидно, это будет работать по-другому для тех, кого япишу заявку на.Я видел много тем на эту тему в Интернете, но большую часть времени это исправлено с помощью хаков JVM, и я хотел бы сделать это надлежащим образом, если это возможно.

Что ставит меня в тупик

Я использую java.time.LocalDate, который предположительно не использует часовой пояс и сохраняет эту дату в столбце базы данных 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 entity

@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>

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Хотя я не использовал Hibernate (и в частности java.time внутри него) в течение очень долгого времени, ваша проблема очень связана с тем фактом, что ваш сервер MySQL ожидает "даты" с часовым поясом UTC и вашим локальным сервером работает в Europe/Berlin часовом поясе, который (по крайней мере) UTC + 1. Это означает, что любая дата, например, 2019-08-04, я думаю, сохраняется как один день раньше (например, 2019-07-04) - это из-за разницы часовых поясов на 1-2 часа.

В большинстве случаев лучше всего рассматривать все значения даты / времени без часового пояса как имеющие часовой пояс UTC по умолчанию. Если это невозможно, вам следует настроить параметры БД на тот же часовой пояс, что и в приложении Java.

Дополнительные показания:

0 голосов
/ 07 апреля 2019

Я исправил свою проблему на данный момент, используя другой часовой пояс для режима гибернации (на котором находится мой локальный сервер), но я не уверен, как он будет работать в будущем, когда я разверну приложение в облаке.Возможно, придется снова изменить параметры на основе веб-сервера.

serverTimezone=Europe/Berlin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...