解决springboot jpa @Column columnDefinition等属性失效问题

 更新时间:2021年10月25日 08:52:08   作者:lu的博客  
这篇文章主要介绍了解决springboot jpa @Column columnDefinition等属性失效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

jpa @Column columnDefinition属性失效

删除一条属性,默认false

#spring.jpa.properties.hibernate.globally_quoted_identifiers=true

原因

开启后, 创建sql语句执行时会添加'`', 会造成columnDefinition 属性失效, author: dreamlu

例如

1.属性设置为true

alter table `xxx` add column `xxx` `varchar(50) default ''`
// sql 语法错误

2.属性为false

alter table xxx add column xx varchar(50) default ''
// 执行成功

可以看出: 有舍有得,第二种要求字段/表等命名不能和mysql或其他数据库中关键字重名

jpa column注解

知识点

@Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下:

  • name:name属性定义了被标注字段在数据库表中所对应字段的名称;
  • unique:unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
  • nullable :nullable属性表示该字段是否可以为null值,默认为true。
  • insertable :insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
  • updatable:updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
  • columnDefinition :columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
  • table :table属性定义了包含当前字段的表名。
  • length :length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
  • precisionscale :precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

precision和scale疑点

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id; 
    @Column(name = "Name")
    private String name;
 
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
 
    @Column(name = "Age")
    private int age;
 
    @Column(name = "Remark", columnDefinition = "text")
    private String remark;
 
    @Column(name = "Salary1", columnDefinition = "decimal(5,2)")
    private double salary1;
 
    @Column(name = "Salary2", precision = 5, scale = 2)
    private double salary2;
 
    @Column(name = "Salary3", columnDefinition = "decimal(5,2)")
    private BigDecimal salary3;
 
    @Column(name = "Salary4", precision = 5, scale = 2)
    private BigDecimal salary4;
    ......
}

数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  `Salary1` decimal(5,2) DEFAULT NULL,
  `Salary2` double DEFAULT NULL,
  `Salary3` decimal(5,2) DEFAULT NULL,
  `Salary4` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

小结一下

1.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准 (oracle数据库中除外,其指定为float类型,因为oracle数据库没有double类型,若针对oracle数据库进行精确,则改为

@Column(name = "Salary1", columnDefinition = "decimal(5,2)")  //或columnDefinition = "number(5,2)"
    private Float salary1;

2.double类型将在数据库中映射为double类型,precision和scale属性无效

3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效

4.precision和scale属性只在BigDecimal类型中有效

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Hibernate实现many-to-many的映射关系

    Hibernate实现many-to-many的映射关系

    今天小编就为大家分享一篇关于Hibernate实现many-to-many的映射关系,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • springboot跨域CORS处理代码解析

    springboot跨域CORS处理代码解析

    这篇文章主要介绍了springboot跨域CORS处理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springboot中nacos-client获取配置的实现方法

    springboot中nacos-client获取配置的实现方法

    本文主要介绍了springboot中nacos-client获取配置的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java数据结构与算法之二分查找详解

    Java数据结构与算法之二分查找详解

    这篇文章主要介绍了Java数据结构与算法之二分查找详解,二分查找算法是一种在有序数组中查找某一特定元素的搜索算法,其思想就是不断地将有序查找表“一分为二”,逐渐缩小搜索区域,进而找到目标元素,需要的朋友可以参考下
    2023-12-12
  • 详解Java的Exception异常机制

    详解Java的Exception异常机制

    Java的Exception异常机制,为什么会突然聊到异常?其实不是突然,而是我已经准备了很久,但苦于没有好的例子来讲解,从表象到底层实现,今天就带大家详细了解Exception异常,需要的朋友可以参考下
    2021-05-05
  • springsecurity实现拦截器的使用示例

    springsecurity实现拦截器的使用示例

    Spring Security 可以替代拦截器,同时还可以提供更加细粒度的权限控制和身份认证,本文就来介绍一下springsecurity实现拦截器的使用示例,感兴趣的可以了解一下
    2023-10-10
  • jpa实现多对多的属性时查询的两种方法

    jpa实现多对多的属性时查询的两种方法

    这篇文章主要介绍了jpa实现多对多的属性时查询的两种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java深入浅出说流的使用

    Java深入浅出说流的使用

    这篇文章主要介绍了Java深入浅出说流的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Android Studio中ButterKnife插件的安装与使用详解

    Android Studio中ButterKnife插件的安装与使用详解

    本篇文章主要介绍了Android Studio中ButterKnife插件的安装与使用详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 浅谈java Properties类的使用基础

    浅谈java Properties类的使用基础

    下面小编就为大家分享一篇浅谈java Properties类的使用基础,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论