如何使用在Spring数据jpa中的postgres中创建的扩展名

时间:2019-02-01 07:03:53

标签: spring-data-jpa

我是spring data jpa的新手。

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

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

例如 如果SCHEMA public不存在citext,请创建扩展名;

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

创建的

现在,当我尝试使用标准实体注释映射表时,由于无法理解此扩展名,这给了我错误

我得到的错误是

g.springframework.boot.SpringApplication-应用程序启动失败 org.springframework.beans.factory.BeanCreationException:创建在类路径资源[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaAutoConfiguration.class]中定义的名称为'entityManagerFactory'的bean时出错:调用init方法失败;嵌套的异常是javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建Hibernate SessionFactory。嵌套的异常是org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:表[attr_grp_defn]的列[domain_obj_nm]中遇到的列类型错误;找到[citext(Types#OTHER)],但期望[varchar(255)(Types#VARCHAR)]     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1634)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)     在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:312)     在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)     在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)     在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)     在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)     在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)     在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)     在org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)     在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)     在org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)     在org.springframework.boot.SpringApplication.run(SpringApplication.java:303)     在org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)     在org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)     在com.sas.mkt.example.app.Application.main(Application.java:43) 由以下原因引起:javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建Hibernate SessionFactory;无法创建Hibernate SessionFactory。嵌套的异常是org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:表[attr_grp_defn]的列[domain_obj_nm]中遇到的列类型错误;找到[citext(Types#OTHER)],但期望[varchar(255)(Types#VARCHAR)]     在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:396)     在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)     在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1692)     在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)]

我希望通过注释的方式来解决此问题,如果仅将其视为文本列也可以。

1 个答案:

答案 0 :(得分:0)

由于ddl.auto属性设置为有效,因此Hibernate正在启动时验证架构。

您可以完全禁用验证,也可以为相关@Column属性指定列定义,以使验证能够通过:

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

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

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

完全禁用验证取决于您的设置。例如,在春季启动应用中,您设置了spring.jpa.hibernate.ddl-auto = false