114 votes

Comment stocker une date Java dans une date Mysql avec JPA ?

Quelqu'un peut-il me dire comment stocker une date Java en datetime Mysql... ?

Lorsque j'essaie de le faire, seule la date est stockée et l'heure reste 00:00:00. dans Mysql la date est stockée comme ceci...

2009-09-22 00:00:00

Je ne veux pas seulement la date mais aussi l'heure...comme

2009-09-22 08:08:11

J'utilise JPA(Hibernate) avec spring ; mes classes de domaine utilisent java.util.Date mais j'ai créé des tables en utilisant des requêtes manuscrites....

voici ma déclaration de création

CREATE TABLE ContactUs (
  id BIGINT AUTO_INCREMENT, 
  userName VARCHAR(30), 
  email VARCHAR(50),
  subject VARCHAR(100), 
  message VARCHAR(1024), 
  messageType VARCHAR(15), 
  contactUsTime DATETIME,
  PRIMARY KEY(id)
);

0 votes

Des morceaux de votre code, peut-être ?

1 votes

2 votes

De nos jours, vous ne devriez plus utiliser java.util.Date du tout (en 2010, il n'y avait probablement pas de meilleur choix). Il est préférable d'utiliser les classes modernes, comme java.time.Instant o java.time.LocalDateTime selon les exigences exactes de la date et de l'heure que vous devez stocker.

170voto

Haim Evgi Points 40786

Voir dans le lien :

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

Le code suivant vient de résoudre le problème :

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

Ceci ' currentTime a été inséré dans la colonne dont le type était DateTime et l'opération a réussi.

6 votes

Mais, currentTime est un objet String, et dans la base de données nous prenons datetime comme type de données, je pense qu'il ne va pas être inséré, n'est-ce pas ?

0 votes

yyyy-MM-dd HH:mm:ss est très important. Prenez note de la capitalisation.

96voto

Pascal Thivent Points 295221

Annotez votre champ (ou getter) avec @Temporal(TemporalType.TIMESTAMP) comme ceci :

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

Cela devrait faire l'affaire.

2 votes

C'est la réponse, en effet !

2 votes

Pour cela, c'est la bonne réponse.

4 votes

Sachez que si vous choisissez cette solution, votre date apparaîtra comme un horodatage lorsqu'elle sera extraite de la base de données. Elle n'aura pas le formatage "yyyy-MM-dd....").

38voto

Michael Borgwardt Points 181658

Peut-être utilisez-vous java.sql.Date ? Alors que cette classe Java a une granularité de l'ordre de la milliseconde (c'est une sous-classe de java.util.Date mauvaise décision de conception), il sera interprété par le pilote JDBC comme une date sans composante horaire. Vous devez utiliser java.sql.Timestamp à la place.

1 votes

Je n'utiliserais pas java.sql.Date o java.sql.Timestamp dans les classes de domaine, mais je suppose que cela a été écrit avant la modification de l'OP.

0 votes

Je le ferais. Les objets java.util.Date ne sont pas comparables aux objets java.sql.Timestamp avec des résultats tout à fait prévisibles.

7voto

Marcx Points 3340

Probablement parce que la date de votre java a un format différent de celui de la java. mysql format ( YYYY-MM-DD HH:MM:SS )

faites ceci

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));

0 votes

Vous avez mentionné le format correct dans la référence et avez ensuite utilisé le mauvais format dans le code.

5voto

Nikopol Points 184

Mysql datetime -> calendrier grégorien

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

Calendrier grégorien -> datetime mysql

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X