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

摘要:
意外发现,当SpringBoot集成jpa来编写实体类时,默认的命名策略是用下划线分隔字段。列批注是否无效?是userName这个词吗?让我创建另一个字段:privateStringpassWord;重复上一操作,仍然会获得相同的结果。也就是说,如果Column注释定义的字段名与属性名相同,则将忽略该字段名。我记得的一件事是Hibernate 5的命名策略已经调整。“spring.jpa.hibernate。命名。策略”没有效果:spring。jpa。冬眠命名。物理策略=组织。冬眠靴子模型命名。PhysicalNamingStrategyStandardImpl此次生效:@ColumnPrivateStringuserName;数据表可以与userName字段关联。

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

Spring Boot版本:1.5.4.release

数据表:

id int,
userName varchar(50)

那么如下的映射:

@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,即字段名和属性名相同,也是驼峰式。

好吧,我自己关联:

@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注解无效?尝试:

@Column(name="yong_hu_ming")
private String userName;

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

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

private String passWord;

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

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

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

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

没有效果。

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

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

这次有效了:

@Column(name="userName")
private String userName;

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

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

免责声明:文章转载自《Spring Boot集成JPA的Column注解命名字段无效的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序,前端大梦想(三)Android Studio- 把项目提交到SVN中操作方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Data JPA:解析JpaSpecificationExecutor & Specification

源码 在前面关于SimpleJpaRepository的文章[地址]中可以得知,SimpleJpaRepository间接实现了JpaSpecificationExecutor接口,本文就详细探究一下该接口。 JpaSpecificationExecutor的定义如下: /** * Interface to allow execution of {@li...

Java分表

应用场景:同一数据库中,有一些结构完全相同的表,只是表名不一样,比如日志表。 分表可能是数据量的考虑,也可能是数据隔离的考虑,比如多租户应用中。 由于项目使用了Spring Data-JPA(JPA实现是Hibernate),而JPA不仅没有提供动态表名映射,而且大部分JPA实现会pre-compile some queries,所以在JPA技术下做分表非...

SpringBoot JPA

-------------------- 剩下的时间不多了,全力做一些自己喜欢的东西 SpringBoot JPA : 默认使用的orm 框架是 hirbernate, 所以具备一些常见的hibernate 的功能, 不用手写数据库中的表,简单的crud 也不需要自己去写,只需继承一个接口就可以了。 @Entity @Table(name = "AUTH_...

3、JPA操作步骤与解决EntityManagerFactory对象创建耗时问题

1.加载配置文件创建实体管理器工厂 EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂) createEntityMnagerFactory(持久化单元名称...

spring data jpa 原生查询(查一个json中的某一字段)

数据库: jpa 查询 java: 1 @Component("ediHistoryDAO") 2 public interface EdiHistoryDAO extends CrudRepository<EdiHistoryDO, Integer>{ 3 4 EdiHistoryDO findById(BigInteger id);...

IDEA创建SpringBoot项目整合JPA,连接Oracle数据库,使用Swagger进行测试

一、信息 IDEA  2019.1 jdk   1.8 Oracle  11.2.0.1.0 二、创建Spring Boot项目 1、选择JDK 2、根据你的公司名填写Group名,Artifact名不能包含大写,IDEA会报告含有非法字符,这一点挺奇怪的 3、选择依赖,这里我们选择Spring Data JPA和Spring Web,点击next 4...