【问题标题】:HibernateException: Missing column: Wrong nameHibernateException:缺少列:名称错误
【发布时间】:2019-01-24 12:37:52
【问题描述】:

在我的 Java 代码中,我有一个名为 isNegative 的字段,数据库中存在一个类似的列。但是 Hibernate 坚持名称应该是 is_negative,即使使用 @Column 强制名称也是如此。

@Column(name="isNegative")
private boolean isNegative;

错误:

原因:org.hibernate.HibernateException:缺少列: datasource.item 中的 is_negative

Application.properties:

#JPA
spring.data.jpa.repositories.enabled=false
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.open-in-view=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.use-new-id-generator-mappings=false
spring.jpa.properties.hibernate.event.merge.entity_copy_observer=allow
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

【问题讨论】:

  • 如果您同时使用 Hibernate 和 Spring Framework,您能否显示文件 hibernate.cfg.xmlapplication.properties,或者如果您使用 Hibernate 作为 JPA 实现,您能否显示文件 persistence.xml
  • @Arnaud 是的,完全是;但问题是缓解措施不起作用。我将命名策略设置为physicalNamingStrategyStandard;但它不起作用。解决方法(编写@column(name="isnegative"))有效;但是对于我所有的列名来说这样做太多了。

标签: java spring hibernate hibernate-mapping naming


【解决方案1】:

请看下面我的分析:

如果您不希望您的命名策略在列名或类名中添加下划线,那么您需要使用的策略类似于:spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl。您在注释 @Table@Column’s 名称属性中提供的内容将保持原样。例如。实体中的 firstName 属性将获得一个列名为 firstName,即没有变化。

如果你不想提供注解,想手动处理表名和列名,你应该扩展类org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl并覆盖所需的方法。如果您仍然在此处的某些情况下使用注释,请记住覆盖的方法将应用于这些注释中编写的名称。 spring.jpa.hibernate.naming.physical-strategy=example.CustomStrategy

【讨论】:

    【解决方案2】:

    你需要 spring.jpa.hibernate.naming.physical-strategy 和 spring.jpa.hibernate.naming.implicit-strategy

    添加关注

    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    

    到 application.properties 可能会有所帮助。此解决方案适用于休眠 5。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      这是由于您的配置,因为您将 spring.jpa.hibernate.naming.physical-strategy 设置为 PhysicalNamingStrategyStandardImpl,这将使用下划线作为名称。

      如果你检查Configure Hibernate Naming Strategy section of Spring Docs,你可以看到:

      Hibernate 使用两种不同的命名策略将名称从对象模型映射到相应的数据库名称。物理和隐式策略实现的完全限定类名可以通过分别设置spring.jpa.hibernate.naming.physical-strategyspring.jpa.hibernate.naming.implicit-strategy 属性来配置。或者,如果 ImplicitNamingStrategyPhysicalNamingStrategy bean 在应用程序上下文中可用,Hibernate 将自动配置为使用它们。

      默认情况下,Spring Boot 配置物理命名策略为 SpringPhysicalNamingStrategy。这个实现提供了相同的 表结构为 Hibernate 4:所有点都替换为下划线 驼峰式大小写也被下划线取代。默认情况下,所有 表名以小写形式生成,但可以 如果您的架构需要,请覆盖该标志。

      要解决您需要删除此属性并改用默认命名策略的问题:

      spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
      

      【讨论】:

      • 谢谢,有什么解决办法?
      • 不使用spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy,而是检查我的编辑。
      猜你喜欢
      • 1970-01-01
      • 2016-10-11
      • 2018-04-23
      • 2013-11-18
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多