spring-data-jpa - 如何使用 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)]
我想要一种通过注释来解决这个问题的方法,如果它被视为文本列就可以了。
解决方案
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
推荐阅读
- r - 如何在 R 中创建 10x12 的绘图网格?
- php - 自定义颜色无法在循环内正确拉出
- android - 类不返回 MutableMap 对象
- macos - 我的 Apache2 .conf 文件有什么问题
- python - 强制 Y 轴从 0 开始
- python - 在 Python 中,如何计算包含固定格式项的格式说明符所隐含的宽度
- sql-server - 通过 JDBC 连接将本地 SQL Server 数据库连接到数据块时出错
- x86 - 即使 VGA 内存已初始化,QEMU 也会提供空白输出
- python - Python如何从实体关系结构派生完整的层次结构
- html - 将站点从 IE 迁移到 Chrome 和 Edge 支持时要研究的场景