Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Spring数据JPA持久化JSR-310类型?_Jpa_Java 8_Spring Data_Spring Data Jpa_Java Time - Fatal编程技术网

如何使用Spring数据JPA持久化JSR-310类型?

如何使用Spring数据JPA持久化JSR-310类型?,jpa,java-8,spring-data,spring-data-jpa,java-time,Jpa,Java 8,Spring Data,Spring Data Jpa,Java Time,我试图将Spring数据JPA1.8与Java8日期/时间API JSR-310一起使用 一切似乎都正常,直到我尝试在两个LocalDateTime之间获取所有车辆。 返回的实体数似乎与它应该返回的实体数只有松散的相关性 实体 @存储库 公共接口车辆存储库扩展了JPA存储库{ 列出findByDateTimeBetween(LocalDateTime开始,LocalDateTime结束); } 存储库 @实体 @表(name=“车辆”) 公共类车辆实现可序列化{ 私有静态最终长serialVe

我试图将Spring数据JPA1.8与Java8日期/时间API JSR-310一起使用

一切似乎都正常,直到我尝试在两个LocalDateTime之间获取所有车辆。 返回的实体数似乎与它应该返回的实体数只有松散的相关性

实体
@存储库
公共接口车辆存储库扩展了JPA存储库{
列出findByDateTimeBetween(LocalDateTime开始,LocalDateTime结束);
}
存储库
@实体
@表(name=“车辆”)
公共类车辆实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“IDX”,nullable=false,unique=true)
@GeneratedValue(策略=GenerationType.AUTO)
私人长途汽车;
@列(name=“DATE\u TIME”,null=false)
private LocalDateTime dateTime=LocalDateTime.now();
//接球手和接球手
}
相关依赖关系

org.springframework.data
为了快速的回答。
我可以通过在packagesToScan属性中添加“org.springframework.data.jpa.convert.threeten”来解决这个问题。现在它似乎工作正常

作为参考,这里是我的工作数据库相关(测试)配置

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="jdbcUrl" value="jdbc:h2:mem:testing"/>
    <property name="username" value="interface"/>
    <property name="password" value=""/>
    <property name="connectionTestQuery" value="SELECT 1" />
</bean>

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <constructor-arg index="0" ref="hikariConfig"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven/>

<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
    <property name="packagesToScan" value="com.company.project.domain,org.springframework.data.jpa.convert.threeten"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

<jpa:repositories base-package="com.company.project.dao" transaction-manager-ref="transactionManager"
                  entity-manager-factory-ref="entityManagerFactory"/>

org.hibernate.dial.h2方言
更新

更新:如果您需要继续使用Hibernate版本<5.0,下面的答案是有效的。Hibernate 5.0支持即时保存JSR-310日期/时间类型。也就是说,如果您使用的是Hibernate 5.0或更高版本,这是一条可行之路。其他人,继续读下去

根本原因是,目前还没有一个广泛使用的JPA提供者真正支持JSR-310类型。然而,从Spring Data JPA 1.8.0开始,我们提供了JPA 2.0转换器,它将把非时间分区的JSR-310类型转换为遗留的
日期
,以便它们可以按原样保存

要使其正常工作,只需将
org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters
注册为您的提供者管理的jpa类之一。有两种方法可以做到这一点:在非常标准的JPA设置中,您可以在
persistence.xml
中列出它。在基于
LocalContainerEntityManagerFactoryBean
的设置中,您只需将类的包添加到
packagesToScan
属性。如果您使用的是Spring Boot,那么将类添加到
@EntityScan
注释就可以实现这一点


后者在涵盖新特性的Spring数据发布系列Fowler ships中有更详细的描述。我花了很长时间才弄清楚如何在我的JPA实体中使用
LocalDateTime
。我在使用最新的Spring boot版本。并在转换服务中进行了大量调试

奥利弗·吉尔克斯(Oliver Gierkes)的回答对我进入最终工作设置有很大帮助:

将Spring数据jpa 1.8.0或更高版本添加到依赖项管理中

compile("org.springframework.data:spring-data-jpa:1.8.2.RELEASE")
为您的应用程序启用@EntityScan@JSR310JPA转换器+(至少)类

@EntityScan(
  basePackageClasses = { Application.class, Jsr310JpaConverters.class }
)
@SpringBootApplication
class Application { … }

当使用Hibernate>=5.0时,更正:DataNucleus JPA支持java.time类型,并且从一年前(当Java8问世时)开始,我就一直在使用这种支持。有了JPA 2.2,这个错误将得到修复,这类spring数据会有任何问题吗?这不是一个错误,这只是工作方式。不幸的是,我无法预测2018年;)。只是给spring boot用户的一个提示。我使用的是目前最新的
springBootVersion='1.2.7.RELEASE'
,它附带了
spring数据jpa:1.7.4.RELEASE
-因此,根据答案,如果您使用spring bootVersion,您需要更新数据jpa依赖项谢谢您的回答,在Spring Boot应用程序中将
JSR310JPA转换器
添加到
@EntityScan
,我就成功了。然而,当我添加hibernate envers进行审计并将JSR310类型的实体标记为要审计时,它抛出了由以下原因引起的
:org.hibernate.MappingException:无法确定AttributeConverter的:BasicType适配器的类型,在表:
,我想envers不知道这些转换器,有没有一种优雅的方法来解决这个问题?我使用的是spring boot
1.3.3.RELEASE
和cloud
Brixton.M4
。谢谢,这对我有用。github上也有一个关于java8特性的示例项目。我无法让它与Spring boot 1.5.8的精心策划的依赖项一起工作。(它附带了hibernate-core-5.0.12.Final.jar)。我必须添加org.hibernate:hibernate-java8:5.1.0.Final才能让它工作。如果mysql数据类型是
TIMESTAMP
,我可以使用它吗?
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>