我有一个要升级到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
)。