Hibernate 默认模式和表注释

Posted

技术标签:

【中文标题】Hibernate 默认模式和表注释【英文标题】:Hibernate default schema and Table annotation 【发布时间】:2016-11-03 01:40:20 【问题描述】:

我正在使用Spring Boot 1.3.5Hibernate 5.1。告诉 Hibernate 使用什么模式的属性是

spring.jpa.properties.hibernate.default_schema

值(模式名称,可以说是 development),然而,不知何故,在使用spring.jpa.hibernate.ddl-auto 创建表时它不会被拾取。让它工作的唯一方法(至少对我的情况有效)是每个实体类都有用

定义的模式名称
 @Table(name = "some_table", schema = "development")

如果可以在 spring boot 应用程序属性 中定义的模式中创建表,那就太好了(可以作为 ENV 传递给不同的环境)。如果@Table 注解中未指定架构,则在公共架构中创建表。

有没有办法为表设置架构而不在表注释中设置它但只使用属性文件配置?

【问题讨论】:

我有相同的用例,我们需要使用不同的模式。您找到解决方法了吗? 同样的问题,我用的是postgresql @roberttrudel 在答案中查看适合我的解决方案 【参考方案1】:

一年后,应用程序得到了发展,我正在使用 Spring Boot 1.5.4Hibernate 5.1.5Postgres 9.6。不确定以前的版本是否存在问题,但现在可以正常使用。

yaml配置文件:

spring:
   datasource:
      driver-class-name: org.postgresql.Driver
      platform: postgresql
   jpa:
      properties:
         hibernate:
            dialect: org.hibernate.dialect.PostgreSQL94Dialect
            default_schema: SCHEMA_NAME

虽然使用 9.6,但 PostgreSQL94Dialect 可用于 9.4 及更高版本,因为给定的 Hibernate 版本没有特定的 PostgreSQL96Dialect。

这样就不需要在@Table注解中指定模式了。

2018 年 10 月更新

查看 Hibernate 的存储库以获取支持的方言并将 git 标签设置为您的 Hibernate 版本:https://github.com/hibernate/hibernate-orm/tree/master/hibernate-core/src/main/java/org/hibernate/dialect

【讨论】:

现在是 org.hibernate.dialect.PostgreSQL95Dialect【参考方案2】:

如果你使用hibernate session factory,你可以添加这个配置;

@Value("$spring.jpa.properties.hibernate.default_schema")
private String HIBERNATE_DEFAULT_SCHEMA;

@Bean
public LocalSessionFactoryBean sessionFactory() 
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setMappingLocations(HIBERNATE_HBM_RESOURCES);

    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
    hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
    hibernateProperties.put("hibernate.default_schema", HIBERNATE_DEFAULT_SCHEMA);

    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;

【讨论】:

我正在寻找一种更简洁的解决方案,仅包含属性文件。【参考方案3】:

抱歉回复晚了。但随着架构也添加

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

到您的属性文件。

【讨论】:

嗨,请解释一下这个配置的目的。

以上是关于Hibernate 默认模式和表注释的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate入门-----Hiberna核心文件详解

Hibernate - OneToMany 注释导致选择查询的左连接不匹配

hibernate配置管理

hibernate 延迟加载

求教第一个hibernae程序的配置文件hibernate.cfg.xml出错了,求帮忙解决,如下

如何在 Hibernate 中为某些实体禁用模式验证?