jodatime依靠其方便的api和与Data无缝转换,成为java开发负责时间逻辑的不二之选。
当jodatime作为Entity的属性自动转换时,一般用到jadira.usertype

在实体类中使用jodatime需要引入jadira.usertype
自动转换有两种配置,一种是在属性上加注解:

// Will be mapped as DATETIME (on MySQL)
 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime createTime;
 
// Will be mapped as DATE (on MySQL), i.e. only date without timestamp
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private LocalDate birthdayDate;

一种是做全局配置
boot的app.properties配置如下:

spring.jpa.properties.jadira.usertype.autoRegisterUserTypes = true

这样在实体类中就可以直接使用jodatime的DateTime类型,在存取数据库的时候会自动完成类型转换

// Will be mapped as DATETIME (on MySQL)
private DateTime createTime;
 
// Will be mapped as DATE (on MySQL), i.e. only date without timestamp
private LocalDate birthdayDate;

不过有一个问题,当数据库保存实体时,时间少了8个小时,2016-06-20 00:00:00存到数据库中变成了2016-06-19 16:00:00,看来是丢了时区信息。

检查mysql时区、连接字符串时区未果之后,jadira官网找到了答案。

原来jadira有两个属性jadira.usertype.javaZone和jadira.usertype.databaseZone,默认值是UTC,需要手工设置

在spring boot中设置如下:

spring.jpa.properties.jadira.usertype.autoRegisterUserTypes = true
spring.jpa.properties.jadira.usertype.javaZone=Asia/Shanghai
spring.jpa.properties.jadira.usertype.databaseZone=Asia/Shanghai

在spring 配置文件中设置如下:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		...
 
		<property name="hibernateProperties">
			<props>
 
				...
				<prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
				<prop key="jadira.usertype.javaZone">Asia/Shanghai</prop>
				<prop key="jadira.usertype.databaseZone">Asia/Shanghai</prop>
			</props>
		</property>
 
	</bean>

参考资料:

Spring Boot: using Joda Time on JPA entity with Hibernate


http://www.joda.org/joda-time/userguide.html
http://jadira.sourceforge.net/

如无特殊声明,本文为Zhonghcc原创文章,转载请注明: 转载自Zhonghcc 's Blog
本文链接地址: jodatime spring mvc (spring boot) 配置 解决时区问题

 回复

(必须)

(必须)

© 2016 Zhonghcc 's Blog Suffusion theme by Sayontan Sinha