Spring Boot的Hibernate字段命名问题(命名策略)

Thi*_*sse 23 hibernate spring-boot

请注意,此代码适用于普通的Spring,但不适用于Spring Boot(v1.3.3),是否有一些我缺少的东西,因为这是从一个有效的弹簧应用程序导入的.下面的代码来自spring boot应用程序

@Entity
@Table(name="project")
public class Project implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id;

    @Column(name="teamId")
    private int teamId;

    //private String Rentabiliteit;

    @Column
    //@Index(name="IProject_status",columnNames="Status")
    private String status;

    @Column
    //@Index(name="IProject_naam",columnNames="Naam")
    private String naam;
    //public Prototype m_Prototype;
    //public Team m_Team;

}
Run Code Online (Sandbox Code Playgroud)

SQL

CREATE TABLE IF NOT EXISTS `project` (
`id` int(11) NOT NULL,
`teamId` int(11) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`naam` varchar(255) DEFAULT NULL
 ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

错误

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:           
 Unknown column 'project0_.team_id' in 'field list'
Run Code Online (Sandbox Code Playgroud)

编辑:Application.yml

spring:

mvc:
  view:
    prefix: /WEB-INF/jsp/
    suffix: .jsp

datasource:
    url: jdbc:mysql://localhost:3306/oxyplast
    username: oxyplastuser
    password: oxyplastuserpw

jpa:
  properties:
    hibernate:
      current_session_context_class: org.springframework.orm.hibernate4.SpringSessionContext 
      namingStrategy: org.hibernate.cfg.DefaultNamingStrategy
Run Code Online (Sandbox Code Playgroud)

Xtr*_*ica 28

Spring Boot提供了ImprovedNamingStrategy默认的命名策略,这使得Hibernate搜索一个team_id列(从int teamId字段推断).由于您的表中不存在此列,因此这是错误的原因.来自Hibernate文档:

改进的命名策略,优先使用嵌入式下划线和混合案例名称

你有两个选择:

  1. 明确规定列名@Column(name="teamId").在早期的Boot版本中曾经存在这样的错误,现在不再存在了.

  2. 更改 Spring Boot属性中的命名策略,并告诉它使用EJB3NamingStrategy不将camelCase转换为snake_case但保持原样的方法.


更新

从1.4开始,由于切换到Hibernate 5,命名策略已经更新SpringPhysicalNamingStrategy,应该非常接近 1.3默认值.

也可以看看:

  • 添加这些属性为我解决了: - spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl --spring.jpa.hibernate.naming.physical-strategy = org.hibernate .boot.model.naming.PhysicalNamingStrategyStandardImpl (3认同)
  • 我通过在文件 application.properties 中添加这一行解决了这个问题: spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl (2认同)

小智 14

如果您使用的是 Spring Boot 2.0.2 和 Hibernate 5.3.4,那么设置以下属性将解决该问题。

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Run Code Online (Sandbox Code Playgroud)