草庐IT

java - JPA 2.1 : Introducing Java 8 Date/Time API

coder 2024-03-03 原文

我想在启用 JPA 的应用程序中添加对 Java 8 日期/时间 API (JSR-310) 的支持

很明显JPA 2.1 does not support the Java 8 Date/Time API .
作为解决方法,最常见的建议是使用 AttributeConverter .

在我现有的应用程序中,我将我的实体更改为对列映射字段使用 LocalDate/LocalDateTime 类型,并为 java.util 添加了旧版 setter/getter .Date 给他们。
我创建了相应的 AttributeConverter 类。

当使用 Query.setParameter()java.util.Date 实例时,我的应用程序现在失败了(它在转换到新 API)。
似乎 JPA 需要新的日期类型并且不会即时转换它。

我预计,如果将一个参数传递给 setParameter(),该类型的类型已注册了一个 AttributeConverter,它会自动由转换器转换。 但是好像不是这样,至少没有使用EclipseLink 2.6.2:

java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.Date for parameter closeDate with expected type of class java.time.LocalDate from query string SELECT obj FROM [...]
    at org.eclipse.persistence.internal.jpa.QueryImpl.setParameterInternal(QueryImpl.java:937) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696]
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.setParameter(EJBQueryImpl.java:593) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696]
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.setParameter(EJBQueryImpl.java:1) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696]
  [...]


问题:

  1. 这种行为是预期的吗?我错过了什么吗?
  2. 是否有一种方法可以在不破坏现有代码的情况下将新的日期类型用作字段?
  3. 您是如何处理在 JPA 中向新日期/时间 API 的过渡的?


更新:

但是,似乎至少使用 EclipseLink,不完全支持存在 AttributeConverter 的自定义类型:

在 JPQL 查询中,实际字段类型和转换后的数据库类型都不能用作参数。 使用转换后的数据库类型时,出现上述异常。 当使用实际字段类型(例如 LocalDate)时,它会直接传递给不知道此类型的 jdbc 驱动程序:

Caused by: java.sql.SQLException: Invalid column type
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:10495) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9974) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:10799) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:10776) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:241)
    at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.setParameterValueInDatabaseCall(DatabasePlatform.java:2506)

我希望 EclipseLink 使用 AttributeConverter 将字段类型转换为 java.sql 类型。 (另请参阅此错误报告:https://bugs.eclipse.org/bugs/show_bug.cgi?id=494999)

这引出了最重要的问题 #4:

  1. 是否有使用 EclipseLink 支持 java 8 日期字段的解决方法/解决方案,包括在此类字段上使用查询参数的可能性

附加信息

最佳答案

前段时间,我将一个 Java EE 7 网络应用程序从 Java 7 转换为 Java 8,并将实体中的 java.util.Date 替换为 LocalDate本地日期时间

  1. 是的,这种行为是预料之中的,因为 AttributeConverter 只在用于实体字段的类型和数据库类型(即 java.sql.日期等);它不会在实体字段类型和查询参数中使用的 java.util.Date 之间进行转换。
  2. 据我所知,不,在将 java.time 类型引入 JPA 后,无法在现有代码中继续使用 java.util.Date实体。
  3. 除了创建必要的 AttributeConverter 实现之外,我将所有出现的 java.util.Date 更改为适当的 java.time 类型,而不是不仅在实体中,而且在 JPA-QL 查询和业务方法中。

对于第 2 项,您当然可以通过使用在 java.utiljava.time 之间转换的实用方法和 getters/setters 来做一些事情,但事实并非如此将全部一路走下去。更重要的是,我不太明白将 java.time 类型引入 JPA 实体属性的意义,如果您不愿意转换使用这些类型的剩余代码 属性。在我在那个 Java EE 应用程序中完成转换工作之后,java.util.Date 的任何地方都没有使用(尽管我还必须为 JSF 创建转换器)。

关于java - JPA 2.1 : Introducing Java 8 Date/Time API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166291/

有关java - JPA 2.1 : Introducing Java 8 Date/Time API的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  9. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  10. java - Ruby 相当于 Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap - 2

    Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur

随机推荐