web-dev-qa-db-fra.com

Pourquoi JPA ne prend pas en charge Java.time.Instant?

Je pense que Java.time.Instant est le meilleur choix pour stocker une date dans DB: c'est le plus probable [~ # ~] horodatage [~ # ~] et vous êtes ne dépendant pas du fuseau horaire, ce n'est qu'un instant sur le temps.

JPA prend en charge LocalDate, LocalTime, LocalDateTime etc. mais pas Instant. Bien sûr, vous pouvez utiliser AttributeConverter ou certaines bibliothèques comme Jadira mais pourquoi cela n'est-il pas pris en charge immédiatement?

17
Filosssof

Je vais réessayer. Il y a une discussion dans le problème . La dernière discussion semble être:

mkarg a déclaré: Bien que cela soit tout à fait correct, la réponse technique est un peu plus complexe: quel est le prédicat final qui rend un type de données éligible à l'inclusion dans l'ensemble des mappages de types obligatoires?

On pourrait dire que ce prédicat est "étant essentiel" ou "étant d'usage courant", mais qui définit ce qu'est "essentiel" ou "usage commun"? Voir, pour certaines applications, la prise en charge de Java.awt.Image et Java.net.URL peut être beaucoup plus essentielle que la prise en charge de LocalDate ou ZonedDateTime. D'un autre côté, d'autres applications peuvent être remplies de LocalDate mais n'utilisent jamais Instant. Alors, où exactement faire la coupe? Cela devient particulièrement complexe lorsque l'on regarde la quantité considérable de types trouvés dans le JRE, et il est évident qu'il doit y avoir une coupure quelque part. Même JavaFX, qui est fourni avec JRE, ne prend pas encore en charge Instant dans la v8, alors pourquoi JPA devrait-il le faire? Et en regardant les progrès actuels du projet Jigsaw, peut-être que le prédicat de qualification pourrait simplement être répondu par "tous les types dans un module de puzzle particulier"?

De toute façon, ce n'est pas à moi de décider. Je soutiens votre demande et je serais ravi de voir la prise en charge de la quasi-totalité Java fois l'API de temps, en particulier pour Instant et la durée, et votre demande a des partisans de premier plan comme par exemple Java Champion Arun Gupa comme je l'ai appris récemment, mais je doute que la réponse finale soit aussi simple et satisfaisante que nous aimerions l'avoir.

Il serait peut-être préférable de simplement configurer un autre JSR, comme "Conversions de type de données communes pour la plate-forme Java", qui fournit beaucoup plus de mappages que la date et l'heure, mais ne serait pas non plus lié) à JPA mais pourrait également être utilisé par JAXB, JAX-RS, et peut-être plus d'API qui traitent le problème de la transformation "en"? Avoir un tel véhicule réduirait vraiment beaucoup le passe-partout.

TL-DR; Il en existe de nombreux types. Nous avons dû tracer la ligne quelque part.

Il y a n nouveau problème pour qu'il soit ajouté à une future version JPA.

Une autre analyse intéressante que j'ai trouvée sur n fil par Douglas Surber (fonctionne sur JDBC):

La version JDK 8 de JDBC inclut la prise en charge de la plupart des types SQL qui correspondent à 310 classes.

  • DATE - LocalDate
  • TIME - LocalTime
  • TIMESTAMP AVEC OUT TIME ZONE - LocalDateTime
  • TIMESTAMP AVEC TIME ZONE - OffsetDateTime

La version JDK 8 de JDBC n'inclut pas de mappage entre les types INTERVAL et les 310 classes correspondantes.

Il n'y a aucun type SQL qui correspond exactement aux 310 autres classes. Par conséquent, la spécification JDBC est silencieuse pour toutes les autres classes.

J'encourage fortement les développeurs JDBC à utiliser les nouvelles 310 classes. Il existe des problèmes avec Java.util.Date, Java.sql.Date, Java.sql.Time et Java.sql.Timestamp. Vous devez les considérer comme obsolètes. Les 310 classes sont largement supérieures.

Douglas

TL: DR; Nous venons de choisir un Java 8 pour chacune des 4 façons possibles de stocker des données temporelles dans la base de données.

Enfin, si vous lisez ce fil il semble qu'il y ait une pression culturelle importante pour garder les API standard petites et simples.

14
Pace

Ce n'est pas un problème JPA mais un problème JDBC.

JDBC prend en charge Date, Timestamp, LocalDate, LocalTime et LocalDateTime mais PAS instantané.

Ce n'est pas un problème Java mais un problème SQL selon lequel ce qui est stocké dans la base de données est une construction année-mois-jour-heure-minute-seconde.

Pensez aux fonctions SQL: YEAR () MONTH () etc ...

Ces fonctions ne peuvent pas être appliquées à de simples millisencods depuis le nombre 1970. Ils nécessitent une construction LocalDateTime pour exécuter ces fonctions.

0
klonq