3
votes

Spring Boot enregistre les données dans la base de données 1 jour de congé

Problème

J'écris une application avec SpringBoot en utilisant la mise en veille prolongée en écrivant des données dans la base de données MySQL. J'obtiens des données pour l'entité à partir d'un formulaire HTML à l'aide de thymeleaf. Lorsque j'enregistre des enregistrements dans une base de données, ils ont 1 jour de retard, donc le 09/04/2019 devient le 08/04/2019.

Ce qui a fonctionné jusqu'à présent

La seule solution pour résoudre ce problème que j'ai trouvée jusqu'à présent était de changer l'heure de mon système pour qu'elle soit en UTC, mais évidemment cela va fonctionner différemment pour à qui j'écris la demande. J'ai vu de nombreux sujets à ce sujet sur Internet, mais la plupart du temps, cela est corrigé à l'aide de hacks JVM et j'aimerais le faire de manière appropriée si possible.

Ce qui me déroute

J'utilise java.time.LocalDate qui n'utilise supposément pas de fuseau horaire et enregistre cette date dans la colonne de base de données SQL avec le type 'Date'. J'ai essayé de changer le fuseau horaire de ma base de données en UTC, mais cela ne semble pas faire de différence. La seule chose qui fait une différence est de changer mon heure Windows en UTC.

application.properties

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

Entité Hibernate

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

public List<Ofwca> findAll();

public Ofwca findByIdOfwca(Integer idOfwca);

}

Controller

@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";
}

Objet d'accès aux données

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

formulaire html

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

2 commentaires

Quel est le type de colonne dans la base de données?


dans MySQL, le type est 'DATE'


3 Réponses :


0
votes

J'ai résolu mon problème pour le moment en utilisant un fuseau horaire différent pour la mise en veille prolongée (dans lequel se trouve mon serveur local), mais je ne sais pas comment cela fonctionnera à l'avenir lorsque je déploierai l'application sur le cloud. Il se peut que vous deviez à nouveau modifier les paramètres en fonction du serveur Web.

serverTimezone=Europe/Berlin


0 commentaires

1
votes

Bien que je n'ai pas utilisé Hibernate (et java.time en particulier) depuis très longtemps, votre problème semble très lié au fait que votre serveur MySQL attend des "dates" avec le fuseau horaire UTC et votre serveur local s'exécute dans le fuseau horaire Europe / Berlin qui est (au moins) UTC + 1. Cela signifie, n'importe quelle date, par exemple Le 04/08/2019 est, je suppose, enregistré comme un jour avant (par exemple, 04/07/2019) - c'est à cause d'une différence de 1 à 2 heures entre les fuseaux horaires.

Dans la plupart des cas, il est préférable de traiter toutes les valeurs de date / heure sans fuseau horaire comme ayant le fuseau horaire UTC par défaut. Si ce n'est pas possible, vous devez régler vos paramètres de base de données pour utiliser le même fuseau horaire que votre application Java.

Lectures complémentaires:


0 commentaires

2
votes

Ce problème se produit avec votre URL jdbc:

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=Europe/Berlin

Vous devez modifier l'URL de connexion jdbc comme suit:

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=UTC

J'ai corrigé mon problème de 1 jour de retard, avec le remplacement ci-dessus.


0 commentaires