如何为Spring Data JPA查询设置默认模式名称?

6
我希望为PostgreSQL设置默认架构。当我尝试设置属性("hibernate.default_schema")并且更新表注释与架构属性时,Hibernate仍会生成没有任何架构名称的查询,如下所示:
select log0_.id as id1_0_ from log log0_

当我将表名更改为“dbo.log”时,可以获得结果集而没有任何错误。
 @Table(name = "dbo.log")

有没有方法可以为postgresql查询设置默认模式?
@Configuration
@EnableJpaRepositories(
    basePackages = "com.test.repository.postgresql",
    entityManagerFactoryRef = "postgresqlEntityManagerFactory",
    transactionManagerRef = "postgresqlTransactionManager"
)
public class PostgreSQLConfig {

    ....

    @Bean(name = "postgresqlEntityManagerFactory")
    public EntityManagerFactory entityManagerFactory(@Qualifier("postgresqlDatasource") DataSource postgresqlDatasource) {

        Properties jpaProperties = new Properties();
        jpaProperties.setProperty("hibernate.dialect", hibernateDialect);
        jpaProperties.setProperty("hibernate.show_sql", hibernateShowSql);
        jpaProperties.setProperty("hibernate.ddl-auto", hibernateDDLAuto);
        jpaProperties.setProperty("hibernate.naming.physical-strategy", hibernatePhysicalStrategy);
        jpaProperties.setProperty("hibernate.default_schema", "dbo");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.POSTGRESQL);
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setJpaProperties(jpaProperties);
        factory.setPackagesToScan("com.test.entity.postgresql");
        factory.setDataSource(postgresqlDatasource);
        factory.afterPropertiesSet();
        return factory.getObject();
    }

}

这是我的实体类:

@Entity
@Table(name = "log", schema = "dbo")
public class Log{
    ....
}

出于好奇,如果您使用Spring Boot,为什么要定义自己的 EntityManagerFactory - Karol Dowbecki
@KarolDowbecki 我有三个不同的数据库服务器(PostgreSQL、SQLServer1、SQLServer2)。每个数据库都有自己的配置、实体和存储库。 - hellzone
2个回答

4
如果您正在使用application.properties文件:
spring.datasource.url=jdbc:postgresql://myserver:5432/mydb spring.jpa.properties.hibernate.default_schema=myschema spring.datasource.username=myuser spring.datasource.password=mypassword spring.datasource.driver-class-name=org.postgresql.Driver

1

这应该在DataSource中的JDBC连接URL中声明。URL模式如下:jdbc:postgresql://host:port/database,其中database是模式。

如果这还不够,在URL中也设置currentSchema

指定要设置的模式(或用逗号分隔的几个模式)以在搜索路径中设置。此模式将用于解析在此连接上使用的语句中使用的未限定对象名称。

这里是JDBC驱动程序的文档:https://jdbc.postgresql.org/documentation/head/connect.html


1
当我更新连接URL属性为"jdbc:postgresql://localhost:5432/mydb?currentSchema=dbo"时,currentSchema无法正常工作。 - hellzone
你确定你没有混淆Postgres和SQL Server吗?dbo听起来像是SQL Server。尝试设置currentSchema=mydb。 - Robert Niestroj
不,我没有混淆。我还为PostgreSQL创建了一个名为“dbo”的模式。我可以使用@Table(name = "dbo.log")和连接URL“jdbc:postgresql://localhost:5432/mydb”获取结果。 - hellzone
可能与命名策略有关。我从未使用过这个。我会将其移除,仅尝试使用 URL。您还可以在回答中添加如何配置“数据源(DataSource)”。 - Robert Niestroj

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