Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
如何使用java.time.LocalDateTime设置jadira PersistentLocalDateTime?_Java_Hibernate_Jpa_Java 8_Jsr - Fatal编程技术网

如何使用java.time.LocalDateTime设置jadira PersistentLocalDateTime?

如何使用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,

我正在尝试使用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,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)
  • 因为它认为我的数据库位于UTC时区(应用程序位于UTC+2),所以在转换到数据库的过程中,它会将我的时间增加两个小时(在转换到数据库的过程中,会将我的时间减少两个小时)。所以在应用程序中我看到了正确的日期和时间,但在数据库中我看不到
  • 我发现a可以向
    @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。