如何使用Spring数据JPA持久化JSR-310类型?
我试图将Spring数据JPA1.8与Java8日期/时间API JSR-310一起使用 一切似乎都正常,直到我尝试在两个LocalDateTime之间获取所有车辆。 返回的实体数似乎与它应该返回的实体数只有松散的相关性 实体如何使用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
@存储库
公共接口车辆存储库扩展了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 boot1.3.3.RELEASE
和cloudBrixton.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>