从Oracle迁移后的Hibernate和postgresql

时间:2017-05-09 13:51:50

标签: spring postgresql hibernate jpa

我对spring-boot,jpa和postgresql数据库的正确配置有问题。

所有我的查询hibernate启动时都没有引号和小写。 Postgresql不接受这个,并返回错误。

我的application.yml文件:

spring:
    datasource:
        url: jdbc:postgresql://127.0.0.1:5432/xxx
        username: xxx
        password: xxx
        driver-class-name: org.postgresql.Driver
        dialect: org.hibernate.dialect.PostgreSQL94Dialect
    jpa:
        show-sql: true
        naming-strategy: org.hibernate.cfg.EJB3NamingStrategy
        hibernate:
            ddl-auto: none
            default-schema: madmax
            dialect: org.hibernate.dialect.PostgreSQL94Dialect
        database-platform: org.hibernate.dialect.PostgreSQL94Dialect
    hadoop:
      config:
        fs.defaultFS: hdfs://192.168.56.104:54310/

enitity的例子:

@Entity
@Table(name="RecommendationItem")
public class RecommendationItem {

预览hibernate查询日志:

Hibernate: select recommenda0_.id as id1_2_ [...] from recommendation_item recommenda0_ where recommenda0_.user_id=?

错误:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
org.postgresql.util.PSQLException: ERROR: relation "recommendation_item" does not exist

可以在不重命名实体中的所有注释的情况下配置此架构吗?

1 个答案:

答案 0 :(得分:1)

我可以想到两种可能性:

  1. 配置参数search_path不包含包含recommendation_item的架构,因此无法找到它。

    解决方案:将架构添加到search_path

  2. 从Oracle迁移表时,您将表名保持为大写,因此称为RECOMMENDATION_ITEM

    这里的问题是,虽然Oracle将不带引号的名称折叠为大写,但是SQL标准指向,而PostgreSQL将它们折叠为小写。

    有两种解决方案:

    • 将表重命名为小写名称 我认为这是更好的解决方案。
    • 始终使用引用的参数,例如"RECOMMENDATION_ITEM"