我使用Spring-boot 1.4.1.RELEASE,使用Spring Data和Hibernate将一些数据保存到MySQL数据库中。
我有这个课程Respondent
,注明了@Entity
,其中一个字段注释如下:
@Column(name = "firstName", nullable = false, length = 100)
private String firstName;
当我尝试通过在save()
上调用CrudRepository<Respondent, Long>
来保存响应者时,我收到此错误:
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;
答案 0 :(得分:4)
默认情况下,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
答案 1 :(得分:0)
我们需要遵循一些命名策略。 列名称应为小写或大写。
@Column(name="FIRSTNAME")
private String firstName;
或
@Column(name="firstname")
private String firstName;
请记住,如果您在数据库中使用列名“ first_name”格式,则必须遵循以下方式
@Column(name="firstName")
private String testName;