zoukankan      html  css  js  c++  java
  • Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,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策略是比较好的方式,只不过,自动映射对于兼容已有的数据表,需要注意一下。如果全新设计,大可放心使用。

  • 相关阅读:
    hdu 4504 dp问题 转化能力不够 对状态的转移也是不够
    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
    BZOJ_4530_[Bjoi2014]大融合_LCT
    BZOJ_3669_[Noi2014]魔法森林_LCT
    BZOJ_1180_[CROATIAN2009]OTOCI_LCT
    BZOJ_2631_tree_LCT
    BZOJ_3282_Tree_LCT
    BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT
    BZOJ_2622_[2012国家集训队测试]深入虎穴_最短路
    BZOJ_3653_谈笑风生_树状数组
  • 原文地址:https://www.cnblogs.com/hyl8218/p/8533551.html
Copyright © 2011-2022 走看看