在PostgreSQL 9.3中验证映射到物化视图时发生Hibernate异常

5
如何将对象映射到材料化视图并保留“<prop key="hibernate.hbm2ddl.auto">validate</prop>”?
当启动Web应用程序时,我会在启动时遇到这个异常:
Caused by: org.hibernate.HibernateException: Missing table: subjects_lp at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1302) at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:512) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1797) ...
根据源代码,看起来 hibernate 在 DatabaseMetadata#getTableMetadata 中只请求类型为“VIEW”和“TABLE”,而 postgresql 存储为“MATERIALIZED VIEW”(使用纯 jdbc 进行检查)。
令人惊讶的是,我无法在 Google 上找到有关此错误的信息。是否有办法在启动时保持 hibernate 验证,也许有办法使一个表/实体不被验证?
Hibernate 版本:4.2.12.Final Postgresql 驱动程序:9.3-1101-jdbc41
实体没有任何特定的注释,只有
@javax.persistence.Entity @javax.persistence.Table(name = "table_name", schema = "schema")

似乎是驱动程序问题。 - StanislavL
2个回答

3

2

如果您使用spring-boot-starter-data-jpa并在应用程序.yml文件中使用ddl-auto:validate,则需要将hibernate.hbm2dll.extra_physical_table_types:"MATERIALIZED VIEW"添加到您的属性中:

spring:
  datasource:
    ~~~
  jpa:
    hibernate:
      ddl-auto: validate
    ~~~
    properties:
      hibernate:
        ~~~
        hbm2dll:
          extra_physical_table_types: "MATERIALIZED VIEW"

我提起这个是因为我尝试了多次才把它放在正确的位置。


1
谢谢。正是我所需要的,但不知道为什么这个信息很难找到。 - Joel
这对我没有用,因为我有一个普通的“视图”,而我找不到替代值来代替“MATERIALIZED VIEW”,例如“VIEW”。是否有一个列出这些有效字面量的地方?使用@子查询而不是@表对我来说可以通过“验证”规则。 - Randy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接