首页 > 解决方案 > 如何使用 spring data jpa 中在 postgres 中创建的扩展

问题描述

我是弹簧数据 jpa 的新手。

我有一个旧数据库,我正在尝试通过 spring data jpa 连接到该数据库。

我在 postgres 中创建了一个扩展名,用于我表中的某些列

例如 CREATE EXTENSION IF NOT EXISTS WITH SCHEMA public;

此扩展主要是为(不区分大小写的文本)创建的

现在,当我尝试使用标准实体注释映射表时,它给了我错误,因为它无法理解这个扩展

我得到的错误是

g.springframework.boot.SpringApplication - 应用程序启动失败 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class 中定义名称为“entityManagerFactory”的 bean 创建错误]: init 方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; 嵌套异常是 org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:在表 [attr_grp_defn] 的列 [domain_obj_nm] 中遇到错误的列类型;在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java: main(Application.java:43) 引起:javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; 嵌套异常是 org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:在表 [attr_grp_defn] 的列 [domain_obj_nm] 中遇到错误的列类型;在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:396) 在 org.springframework.orm.jpa 找到 [citext (Types#OTHER)],但期待 [varchar(255) (Types#VARCHAR)] .AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336) 在 org.springframework.beans.factory。support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1692) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630) ...省略了16个常见框架原因:org.hibernate.tool.schema .spi.SchemaManagementException:架构验证:在表 [attr_grp_defn] 的列 [domain_obj_nm] 中遇到错误的列类型;找到 [citext (Types#OTHER)],但期望 [varchar(255) (Types#VARCHAR)] SchemaManagementException:模式验证:在表 [attr_grp_defn] 的列 [domain_obj_nm] 中遇到错误的列类型;找到 [citext (Types#OTHER)],但期望 [varchar(255) (Types#VARCHAR)] SchemaManagementException:模式验证:在表 [attr_grp_defn] 的列 [domain_obj_nm] 中遇到错误的列类型;找到 [citext (Types#OTHER)],但期望 [varchar(255) (Types#VARCHAR)]

我想要一种通过注释来解决这个问题的方法,如果它被视为文本列就可以了。

标签: spring-data-jpa

解决方案


Hibernate 在启动时验证模式,因为 ddl.auto 属性设置为验证。

您可以完全禁用验证,也可以为@Column应该允许验证通过的相关属性指定列定义:

https://docs.oracle.com/javaee/5/api/javax/persistence/Column.html#columnDefinition()

@Column(columnDefinition = "citext") //or "other"?
private String myField; 

请注意,列定义仅影响 DDL 操作,即模式创建或验证。

禁用验证完全取决于您的设置。例如,在 spring-boot 应用程序中,您设置spring.jpa.hibernate.ddl-auto = false


推荐阅读