我有一个想要升级到 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在数据库中,但INTEGER在int属性的 Java 代码中),所以 Hibernate 使用类型名称来比较类型。SMALLINT但是 H2和 PostgreSQL报告了相同的数据库类型INT2(这有点奇怪,因为 pgAdmin 将该列也显示为SMALLINT)。
有什么方法可以告诉 Hibernate 或 JDBC 驱动程序这两个类型名称应该被同等对待吗?
PS:我已经找到了一些建议使用@Type注释的答案,但是(使事情变得更加复杂),该int属性包含在一个@Embedded来自库且我无法更改的类中,所以我必须使用@AttributeOverrides(反过来不允许@Type)。