首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用hibernate PostgreSQL存储java.time.ZonedDateTime失败

问题描述:使用Hibernate将java.time.ZonedDateTime存储到PostgreSQL数据库时失败。

答案:

在使用Hibernate将java.time.ZonedDateTime存储到PostgreSQL数据库时失败,可能是因为Hibernate默认不支持将java.time.ZonedDateTime直接映射到数据库中的日期时间类型。为了解决这个问题,我们可以通过自定义Hibernate的类型转换器来实现。

步骤如下:

  1. 创建一个自定义的Hibernate类型转换器类,实现org.hibernate.usertype.UserType接口。例如,我们可以创建一个名为ZonedDateTimeUserType的类。
代码语言:java
复制
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.usertype.UserType;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZonedDateTimeUserType implements UserType {

    @Override
    public int[] sqlTypes() {
        return new int[]{Types.TIMESTAMP};
    }

    @Override
    public Class returnedClass() {
        return ZonedDateTime.class;
    }

    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == y) {
            return true;
        }
        if (x == null || y == null) {
            return false;
        }
        return x.equals(y);
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        return x.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
        java.sql.Timestamp timestamp = rs.getTimestamp(names[0]);
        if (timestamp != null) {
            return ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.systemDefault());
        }
        return null;
    }

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
        if (value != null) {
            ZonedDateTime zonedDateTime = (ZonedDateTime) value;
            st.setTimestamp(index, java.sql.Timestamp.from(zonedDateTime.toInstant()));
        } else {
            st.setNull(index, Types.TIMESTAMP);
        }
    }

    // 其他方法省略...
}
  1. 在实体类中使用自定义的类型转换器。在需要存储ZonedDateTime的属性上,使用@Type注解指定使用ZonedDateTimeUserType。
代码语言:java
复制
import org.hibernate.annotations.Type;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.ZonedDateTime;

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    @Type(type = "com.example.ZonedDateTimeUserType")
    private ZonedDateTime dateTime;

    // 其他属性和方法省略...
}
  1. 配置Hibernate使用自定义的类型转换器。在Hibernate的配置文件(如hibernate.cfg.xml)中,添加以下配置:
代码语言:xml
复制
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/mydatabase</property>
<!-- 其他配置省略... -->
<typedef name="com.example.ZonedDateTimeUserType" class="com.example.ZonedDateTimeUserType"/>
  1. 现在,当使用Hibernate将ZonedDateTime存储到PostgreSQL数据库时,应该能够成功保存和读取该属性。

注意:以上步骤是基于Hibernate的解决方案。如果使用其他ORM框架或直接使用JDBC,可能需要采取不同的方法来处理java.time.ZonedDateTime类型的存储。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

hibernate validator】(二)声明和验证Bean约束

属性级别约束 必须注释getter而不是setter,这样可以限制没有设置方法的只读属性 该级别将使用属性访问策略来访问验证的值,即验证引擎通过属性访问器来访问数据...{     @NotNull     private String name;     //... } 在校验Car的时候,会校验Person,因此若Car引用的Person的name为空,则会校验失败...」 09:35:00.447 [main] INFO com.bm.validate.TestValidatorBean - 报告约束失败的原数据:false 「告约束失败的元数据」 09:35:00.447...java.time.MonthDay,java.time.OffsetDateTime,java.time.OffsetTime,java.time.Year,java.time.YearMonth,java.time.ZonedDateTime...使用该equals()方法确定相等性。默认消息不包括重复元素的列表,但是您可以通过覆盖消息并使用{duplicates}message参数来包括它。

22240

Java中使用Hibernate系列之加载并存储对象学习(第三节)

经过第一、二节的学习,现在可以使用Hibernate来加载和存储对象了,先编写一个带有main()方法的EventManager类: 网络配图 代码如下: package events; import...,现在Hibernate负责与SQL进行沟通,并把INSERT命令传给数据库;在运行之前,让我们看一下处理Session和Transaction的代码。...Session在第一次被使用的时候,即第一次调用getCurrentSession()的时候,其生命周期就开始,然后它被Hibernate绑定到当前线程中,当事务结束的时候,不管是提交还是回滚,Hibernate...假若你再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元,这种线程绑定(thread-bound)的编程模型(model)是使用Hibernate的最广泛的方式...网络配图 好了,这一节的学习先到这里,后面章节中会继续学习Hibernate。我们学习方式是每一节学习一个知识点(每天花10分钟学习)。

47170

Mycat(实践篇 - 基于PostgreSQL的水平切分、主从复制、读写分离)

准备环境 PostgreSQL(Version : 10.1)主从环境搭建 对应数据库建立(以下例子中使用的都是默认存在的postgres数据库,可以不用额外添加) 配置server.xml...其他类型的数据库则需要使用 JDBC 驱动来支持 引述《Mycat权威指南》里面的原话: 从 1.6 版本开始支持 postgresql 的 native 原始协议。...所以,具体的解决方案就是找一个postgresql的jar包,然后丢到mycat的lib目录下,不然就会出现启动失败或者连接不到postgre数据库的异常情况。...之后似乎必须更改为:none,否则使用其它属性都会报错(这里Mysql与PostgreSQL不同,似乎是一个未解决的bug,这也就意味着以后新增字段都要手动连上数据库进行添加了...)...properties: hibernate: dialect: org.hibernate.dialect.MySQL5Dialect datasource: url

2.5K11

Spring Boot中使用PostgreSQL数据库

另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。...所以下面简单介绍一下,PostgreSQL相比于MySQL来说,都有哪些优势,如果你有这些需求,那么选择PostgreSQL就优于MySQL,反之则还是选择MySQL更佳: 支持存储一些特殊的数据类型,...PostgreSQL pgAdmin Spring Boot中如何使用 在安装好了PostgreSQL之后,下面我们尝试一下在Spring Boot中使用PostgreSQL数据库。...=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.hbm2ddl.auto=create 第四步:创建用户信息实体...PostgreSQL pgAdmin 思考一下 如果您之前有读过本系列教程中关于MySQL的10多篇使用案例,再看这篇使用PostgreSQL的案例,是不是感觉差别非常小?

4.7K50

Hibernate识别数据库特有字段实例详解

比如PostgreSQL的Interval类型,可以非常方便的保存一个时间段的数据。本文以添加Interval类型支持为例,说明为Hibernate添加特有数据类型支持的方法。...Hibernate提供了丰富的数据类型支持,但对于部分数据库专有的数据类型,提供的支持就很有限了。比如PostgreSQL的Interval类型,对于保存一个"时间段"数据就非常方便。...package framework.postgresql; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor...; import org.hibernate.usertype.UserType; import org.postgresql.util.PGInterval; import java.io.Serializable...但Hibernate还不知道怎么使用它。为此,我们需要通过在Entity上使用使用TypeDef注解,并在属性上使用Type注解。 比如: ? ...

95610

使用PostgreSQL中的DO块或存储过程实现数据库初始化脚本的幂等性

今天,我们就以PostgreSQL数据库为例,介绍如何使用DO块或存储过程来实现脚本的幂等性。 什么是幂等性? 在计算机科学中,幂等性是一个重要的概念。...在PostgreSQL中,由于CREATE DATABASE和CREATE USER语句不支持"IF NOT EXISTS"语法,所以我们需要使用一种特殊的存储过程,叫做匿名代码块(也被称为"DO"块)...然而,存储过程和DO块也有一些重要的区别: 存储过程是有名称的,并且可以接受参数。这意味着你可以多次调用同一个存储过程,而且每次调用时,可以使用不同的参数。 存储过程在定义之后,会被保存在数据库中。...结论 在编写数据库初始化脚本时,通过合理使用PostgreSQL中的DO块或存储过程,我们可以有效地实现脚本的幂等性,这对于系统升级和数据库的维护来说,是非常重要和有用的。...希望这篇文章能够帮助到在使用PostgreSQL的你,或者激发你对其他数据库中类似功能的探索。

57510

Spring Boot 2.4.3、2.3.9 版本发布,你准备好了吗?

错误修复 1、修复 DataSourceBuilder 无法入参用户名导致 postgresql链接失败问题 2、修复 DatabaseDriver未正确检测到Amazon Redshift 驱动的问题...3、修复 在通过jOOQ访问数据库之前,Flyway或Liquibase执行动作可能尚未完成而导致访问失败的问题 4、修复 当spring.profiles.include作为YAML列表写入配置文件使用时遇到异常情况不会有报错信息的问题...5、修复缺少新版本 hibernate-micrometer 模块的依赖关系导致管理出错的问题 6、修复 DataSourceBuilder 无法入参用户名导致 h2 链接失败问题 7、修复当bean...定义为ConnectionFactory,会缺少RabbitMQ监控指标的问题 8、修复当使用JPA延迟存储库时,上下文中的ContextRefreshedEvent可能会导致死锁的问题 9、修复Gradle...ConnectionFactory,会缺少RabbitMQ监控指标的问题 修复当使用JPA延迟存储库时,上下文中的ContextRefreshedEvent可能会导致死锁的问题 修复Spring Data

2.1K20

JPAHibernate问题汇总

项目使用的是SpringBoot框架,JPA默认使用的是hibernate的实现,而hibernate的懒加载机制其实就是延迟加载对象,如果没有在session关闭前使用到对象里除id以外的属性时,就只会返回一个没有初始化过的包含了...@JoinColumn注解无法找回数据导致报错 使用@JoinColumn时如果无法找到对应的record,就会报错导致查询失败: 1 2 3 4 5 6 7 javax.persistence.EntityNotFoundException...:95) 通过使用Hibernate提供的@NotFound(action = NotFoundAction.IGNORE)可以避免这个问题,该注解的默认值是NotFoundAction.EXCEPTION...但是该注解以废弃,官方推荐使用的是JPA规范的@OrderColumn。 前两种方法比较常用,不过第二个方法是Hibernate自身的规范。...,那么上述SQL在执行时就会报错: 1 2 3 Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist:

2.4K20

java单元集成测试中使用Testcontainers

测试容器使以下类型的测试更加容易: 数据访问层集成测试: 使用MySQL,PostgreSQL或Oracle数据库的容器化实例测试您的数据访问层代码,但无需在开发人员的计算机上进行复杂的设置,并且测试将始终从已知的数据库状态开始...您将获得每个测试会话或测试失败的视频记录。 更多: 可以签出各种贡献的模块,或使用 GenericContainer作为基础创建自己的自定义容器类。...在本文中,将演示集成postgresql容器和mockserver容器的测试。...当您在应用程序中使用JPA时(通过Spring Data JPA),此步骤是必需的 spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect...; } } ---- 3.总结: Testcontainers轻松的解决了集成测试时测试代码与本地组件耦合,从而出现各种意外失败的问题(比如本地数据库中存在脏数据影响到了集成测试,多个集成测试同时运行时相互干扰导致测试结果意外失败

2.8K20

SpringBoot连接使用PostgreSql数据库

其实使用IDEA的话无需配置Maven什么的,如果你们公司不是强制要求使用Eclipse的话,只需要有个JDK的环境即可,IDEA自带了一个版本的Maven,还是挺新的,目前IDEA最新版2.2.3的版本...目前在Resources目录下的application大多数是使用yml语法了。...现在已经太长时间没有接触过 postgresql了,长期使用MySQL,只要数据量在几百万,加加索引,优化SQL工作量还是不大,而且外面的公司还是比较愿意使用MySQL的,我面试别人的时候,也不会问什么乱七八糟的数据库...1、情况说明 在这里我使用SpringBoot配置JPA连接到PostgreSql数据库的。...spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.hbm2ddl.auto

3K10

如何用jdbc连接数据库(数据库java连接)

其实使用IDEA的话无需配置Maven什么的,如果你们公司不是强制要求使用Eclipse的话,只需要有个JDK的环境即可,IDEA自带了一个版本的Maven,还是挺新的,目前IDEA最新版2.2.3的版本...目前在Resources目录下的application大多数是使用yml语法了。...现在已经太长时间没有接触过 postgresql了,长期使用MySQL,只要数据量在几百万,加加索引,优化SQL工作量还是不大,而且外面的公司还是比较愿意使用MySQL的,我面试别人的时候,也不会问什么乱七八糟的数据库...1、情况说明 在这里我使用SpringBoot配置JPA连接到PostgreSql数据库的。...spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.hbm2ddl.auto

7.1K10

使用 SQL NOWAIT 的最佳方式

他目前正在开发Hypersistence Optimizer,他还利用业余时间开发各种开源项目,例如Hibernate Types和FlexyPool,并在StackOverflow网址上回答问题。...由于所有的主要数据库都支持此功能,Hibernate提供了一个NOWAIT选项,可以在不同数据库上调用这个功能,而且不影响代码的数据库可移植性。...02 — SQL NOWAIT 为了避免SQL 语句在获取锁时被阻塞 ,我们可以使用 NOWAIT 子句,如下图所示: 现在,在获取锁时,该语句将立即抛出锁获取失败而不是阻塞,因此您可以捕获异常并继续执行其他操作...子句并不相同,见下表: 数据库 独占锁的NOWAIT子句 Oracle FOR UPDATE NOWAIT SQL Server WITH (UPDLOCK,HOLDLOCK,ROWLOCK,NOWAIT) PostgreSQL...FOR NO KEY UPDATE NOWAIT MySQL FOR UPDATE NOWAIT 幸运的是,在使用 JPA 和 Hibernate 时,开发人员无需编写针对特定数据库的SQL语句即可获取正确的

77810
领券