【问题标题】:Spring Data doesn't seem to understand @Column nameSpring Data 似乎不理解@Column 名称
【发布时间】:2017-03-22 04:24:05
【问题描述】:

我正在使用 Spring-boot 1.4.1.RELEASE,通过 Spring Data 和 Hibernate 将一些数据持久化到 MySQL 数据库中。

我有这门课,Respondent,用@Entity 注释,其中一个字段注释如下:

@Column(name = "firstName", nullable = false, length = 100)
private String firstName;

当我尝试通过在其CrudRepository<Respondent, Long> 上调用save() 将受访者保存到数据库时,我收到此错误:

ERRORcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'first_name' in 'field list'

此错误在我为该字段添加 @Column 注释之前就开始发生了,所以我认为将 firstName 映射到 first_name 是一些默认的 Hibernate 行为,但我已经添加了 @Column 注释并没有任何改变.还是错了吗?我已经用mvn clean package 重建了应用程序。

这是我的受访者实体:

@Entity
public class Respondent {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @Column(name = "firstName", nullable = false, length = 100)
    private String firstName;
    private String tussenvoegsel;
    @Column(name = "lastName", nullable = false, length = 100)
    private String lastName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "Company_id", nullable = false)
    private Company company;

【问题讨论】:

  • 您确定“firstName”列存在吗?另外,通常我从不使用@entity 类中未注释的任何声明文件,例如“private String tussenvoegsel;”
  • 100% 确定。它的 first_name 不存在,并且 hibernate 仍在映射我的字段。
  • 尝试将@Column(name = "firstName"改为小写@Column(name = "firstname"
  • 似乎您在配置stackoverflow.com/questions/376093/hibernate-column-name-issues 中设置了ImproveNamingStrategy。你能发布你的休眠配置类吗?

标签: mysql hibernate spring-boot spring-data spring-data-jpa


【解决方案1】:

默认情况下 Spring uses jpa.SpringNamingStrategy 来生成表名。

ImprovedNamingStrategy 会将CamelCase 转换为SNAKE_CASE,而EJB3NamingStrategy 只是使用未更改的表名。

您可以尝试将naming_strategy更改为:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

或者@Column name属性应该是小写的@Column(name = "firstname")


对于Hibernate 5,这应该可以工作(我不太确定你是否还需要上面的那个。但两者都试试):

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 中的命名策略存在问题,这就是我正在使用的:github.com/spring-projects/spring-boot/issues/2763
  • @HenriqueOrdine 更新了 hibernate 5 属性的答案。试试看
【解决方案2】:

我们需要遵循一些命名策略。 列名应为小写或大写。

 @Column(name="FIRSTNAME")
    private String firstName;

@Column(name="firstname")
private String firstName;

请记住,如果您在数据库中有列名“first_name”格式,那么您必须遵循以下方式

@Column(name="firstName")
private String testName;

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2015-09-24
    • 2011-03-30
    • 1970-01-01
    • 2018-02-04
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多