前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot集成JPA的Column注解命名字段无效的问题

Spring Boot集成JPA的Column注解命名字段无效的问题

作者头像
pollyduan
发布2019-11-04 13:31:29
2.7K0
发布2019-11-04 13:31:29
举报

偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名。

Spring Boot版本:1.5.4.release

数据表:

代码语言:javascript
复制
id int,
userName varchar(50)

那么如下的映射:

代码语言:javascript
复制
@Data
@Entity
@Table(name="t_users")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain=true)
public class User {
	@Id
	@GeneratedValue
	private Integer id;
	private String userName;
}

会发现,数据库里增加了一个字段"user_name",那么是否可以推测spring boot jpa使用的默认策略是ImprovedNamingStrategy?

由于测试用例的表已经存在,之前使用的是DefaultNamingStrategy,即字段名和属性名相同,也是驼峰式。

好吧,我自己关联:

代码语言:javascript
复制
@Data
@Entity
@Table(name="t_users")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain=true)
public class User {
	@Id
	@GeneratedValue
	private Integer id;
	@Column(name="userName")
	private String userName;
}

有问题了,没有效果。

难道Column注解无效?尝试:

代码语言:javascript
复制
@Column(name="yong_hu_ming")
private String userName;

这回有效果了,有了一个新字段 "yong_hu_ming",column注解有效果呀。

难道是userName这个单词,我再做一个字段:

代码语言:javascript
复制
private String passWord;

重复之前的操作,依然是同样的结果。

也就是说,如果Column注解定义的字段名和属性名一样,会被忽略。奇怪的设计。

像Hibernate4一样,配置一下命名策略:

代码语言:javascript
复制
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.DefaultNamingStrategy

没有效果。

想起一件事,记得Hibernate5的命名策略有过调整,"spring.jpa.hibernate.naming.strategy" 没效果了:

代码语言:javascript
复制
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

这次有效了:

代码语言:javascript
复制
@Column(name="userName")
private String userName;

数据表里可以关联到userName字段了。

当然,ImprovedNamingStrategy策略是比较好的方式,只不过,自动映射对于兼容已有的数据表,需要注意一下。如果全新设计,大可放心使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档