休眠ddl验证smallint与int2

时间:2019-05-08 15:47:47

标签: java postgresql hibernate jpa h2

我有一个要升级到JPA的旧应用程序。对于本地开发和测试,我已经配置了一个H2内存数据库,在测试和生产服务器上有一个PostgreSQL数据库,该数据库定义了我要映射的架构。我想配置Hibernate以验证DDL映射(在Spring Boot中使用spring.jpa.hibernate.ddl-auto=validate)。

在给定的PostgreSQL数据库中,列类型为SMALLINT,但相应属性的Java类型为int

问题来了: 如果我用@Column(columnDefinition="SMALLINT" ...)注释属性,那么使用H2数据库进行验证就可以了,对于PostgreSQL,则可以看到错误found [int2 (Types#SMALLINT)], but expecting [smallint (Types#INTEGER)]

如果我将注释更改为@Column(columnDefinition="INT2" ...),那么PostgreSQL很高兴,但是H2抱怨found [smallint (Types#SMALLINT)], but expecting [int2 (Types#INTEGER)]

因此,显然Types是不同的(数据库中的SMALLINT,但是Java代码中的INTEGER属性中的int),因此Hibernate将类型名称用于比较类型。但是H2将相同的数据库类型报告为SMALLINT,而PostgreSQL将其报告为INT2(这很奇怪,因为pgAdmin将列也显示为SMALLINT)。

是否可以通过某种方式告诉Hibernate或JDBC驱动程序应将这两个类型名称视为相同?

PS:我已经发现一些建议使用@Type注释的答案,但是(为了使事情更加复杂),int属性包含在@Embedded类中,该类是从库中访问,并且无法更改,因此我必须使用@AttributeOverrides(这反过来又不允许@Type)。

0 个答案:

没有答案