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

  • 相关阅读:
    Unity NGUI实现技能CD效果
    Unity NGUI中Anchor的用法
    Unity 技能按钮触发特效
    Unity NGUI 图集Atlas制作
    Unity NGUI 创建简单的按钮
    Unity 地形
    Unity GUI编程
    Unity 随机数的使用
    linux命令之pssh命令
    MySQL中SQL语句2
  • 原文地址:https://www.cnblogs.com/hyl8218/p/8533551.html
Copyright © 2020-2023  润新知