如何使用java.time.LocalDateTime设置jadira PersistentLocalDateTime?
我正在尝试使用Hibernate和JPA持久化如何使用java.time.LocalDateTime设置jadira PersistentLocalDateTime?,java,hibernate,jpa,java-8,jsr,Java,Hibernate,Jpa,Java 8,Jsr,我正在尝试使用Hibernate和JPA持久化java.time.LocalDateTime。我使用了Jadira框架(“org.Jadira.usertype:usertype.core:3.2.0.GA”和“org.Jadira.usertype:usertype.extended:3.2.0.GA”)。我创建了package info.java文件并在那里创建了@TypeDefs({@TypeDef(defaultForType=java.time.LocalDateTime.class,
java.time.LocalDateTime
。我使用了Jadira框架(“org.Jadira.usertype:usertype.core:3.2.0.GA”和“org.Jadira.usertype:usertype.extended:3.2.0.GA”)。我创建了package info.java
文件并在那里创建了@TypeDefs({@TypeDef(defaultForType=java.time.LocalDateTime.class,typeClass=org.jadira.usertype.dateandtime.threeten.PersistentLocalDateTime.class)
。我测试了该解决方案,并将java.time.LocalDateTime
字段正确地存储/检索到我的MySQL数据库中的DATETIME
列(几乎)
唯一的问题是,数据库中的值与Java中字段的正确时间值相差+2小时。我在CEST(UTC+2),所以我知道这是时区的问题。我调试了PersistentLocalDateTime
的代码,这就是我发现的
PersistentLocalDateTime
正在使用org.jadira.usertype.dateandtime.threeten.columnmapper.AbstractTimesThreetenColumnMapper
AbstractTimestampThreeTenColumnMapper
的字段ZoneOffset databaseZone
默认设置为ZoneOffset.of(“Z”)
(UTC)@TypeDef
添加参数,因此我指定了如下参数:
@TypeDef(defaultForType = LocalDateTime.class, typeClass = PersistentLocalDateTime.class,
parameters = {
@Parameter(name = "databaseZone", value = "+02:00")
}),
但我有一个例外:
java.lang.IllegalStateException: Could not map Zone +02:00 to Calendar
at org.jadira.usertype.dateandtime.threeten.columnmapper.AbstractTimestampThreeTenColumnMapper.getHibernateType(AbstractTimestampThreeTenColumnMapper.java:59)
我调试了多一点AbstractTimesThreetenColumnMapper
有两种方法:
public final DstSafeTimestampType getHibernateType() {
if (databaseZone == null) {
return DstSafeTimestampType.INSTANCE;
}
Calendar cal = resolveCalendar(databaseZone);
if (cal == null) {
throw new IllegalStateException("Could not map Zone " + databaseZone + " to Calendar");
}
return new DstSafeTimestampType(cal);
}
private Calendar resolveCalendar(ZoneOffset databaseZone) {
String id = databaseZone.getId();
if (Arrays.binarySearch(TimeZone.getAvailableIDs(), id) != -1) {
return Calendar.getInstance(TimeZone.getTimeZone(id));
} else {
return null;
}
}
getHibernateType
方法引发异常,因为resolveCalendar
方法返回null
。为什么返回null
?因为java.time.ZoneOffset
和java.util.TimeZone
的时区ID不匹配。就我所见,唯一可能匹配的值是Z
。任何其他值都会导致异常
有什么方法可以正确设置它吗?或者它是Jadira框架中的一个bug?它看起来像是一个严重的bug。问题是jadira.usertype.databaseZone参数被解析为ZoneOffset而不是ZoneId。这样,resolveCalendar方法将比较两种不同类型的分区和偏移。有趣的是,参数名为databaseZone,但它不包含区域。它只包含偏移量
5.0.0.GA通过ZoneId映射解决了这一问题。免责声明:我维护Jadira。