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

目录
  • jpa @Column columnDefinition属性失效
    • 原因
    • 例如
  • jpa column注解
    • 知识点
    • precision和scale疑点
    • 小结一下

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类型中有效

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

(0)

相关推荐

  • mybatis自动生成@Table、@Column、@Id注解的方法

    在pom.xml中添加如下插件以及插件相关的依赖 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <!--配置文件的位置--> <configurat

  • JAVA注解相关知识总结

    注解的概念 java注解: 比较官方的说法: 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理.通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息. 注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值. 说说我的理解 注解

  • java 注解的基础详细介绍

    java 注解的基础详细介绍 前言 注解是Java引入的一项非常受欢迎的补充,它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读.使用注解能够帮助我们避免编写累赘的部署描述文件,以及其他生成的文件. 注解的语法比较简单,除了@符号的使用之外,它基本与java固有的语法一致.但由于java源码中提供的内置注解很少,所以大部分同学对注解都不是很了解,虽然我们都接触过,比如java内置的几种注解: @Override,表示当前的方法定义

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

    目录 jpa @Column columnDefinition属性失效 原因 例如 jpa column注解 知识点 precision和scale疑点 小结一下 jpa @Column columnDefinition属性失效 删除一条属性,默认false #spring.jpa.properties.hibernate.globally_quoted_identifiers=true 原因 开启后, 创建sql语句执行时会添加'`', 会造成columnDefinition 属性失效, au

  • Springboot jpa @Column命名大小写问题及解决

    目录 Springboot jpa @Column命名大小写 一.问题 二.解决方案 @Column 大小写 规范 Springboot jpa @Column命名大小写 一.问题 驼峰命名会被自动转成数据库下划线命名,指定@Column的name也不起作用 举例: @Column(nullable = false,name = "resolvedDate") private Timestamp resolvedDate; resolvedDate会被转成resolved_date 二

  • 解决springboot+shiro 权限拦截失效的问题

    最近因为项目需要,接触了shiro.新手入门 发现权限拦截失效, 一直以为是以为授权和DB的问题 研究了一个下午,终于发现了问题所在 我的访问路径没有写前面的斜杠!!,而DB中的资源路径是可以省略的,崩溃了吧 但是问题来了,为什么在其他地方可以忽略掉前面的小斜杠呢? 经过几分钟的捣鼓发现,在springboot中,不论是thymeleaf的模板也好(我用的thymeleaf),还是后端代码也好,底层会自动补全这个斜杠 问题解决!! 补充知识:SpringBoot整合shiro的一个完整的小案例

  • 解决springboot的JPA在Mysql8新增记录失败的问题

    springboot的JPA在Mysql8新增记录失败 springboot版本是1.3.0.M1,连接的mysql版本为8,用spring-boot-starter-data-jpa操作数据库,新增记录时应用抛出以下异常: 2018-02-21 12:52:59.471 DEBUG 6408 --- [nio-9090-exec-1] o.s.web.servlet.DispatcherServlet : Could not complete request org.springframewo

  • springboot jpa 延迟加载问题的2种解决

    springboot jpa 延迟加载问题 在springboot中,在application.properties的配置文件中新增spring.jpa.open-in-view=true方法失效 经过测试,有两种解决办法: 1.在application.properties的配置文件中新增 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true: 2.在测试的方法上添加@Transactional注解. 关于springbo

  • SpringBoot JPA懒加载失效的解决方案(亲测有效)

    SpringBoot JPA懒加载失效 使用springBoot JPA 对两个实体类进行双向关联,并设置了懒加载,如下: 然后在查询后用到了roles,会报错, 解决办法如下: 1. 在配置文件中加入: spring.jpa.properties.hibernate.enable_lazy_load_no_trans =true 2. 如果你是在SpringBoot的测试类 中使用报错,则在方法上加入@Transactional注解 在百度查询时发现有人说 修改该配置: spring.jpa.

  • 解决option标签selected="selected"属性失效的问题

    要在select标签上面加上autocomplete="off"关闭自动完成,不然浏览器每次刷新后将自动选择上一次关闭时的option,这样默认属性selected="selected"就会失效啦 要记住每次遇到select标签时就最好要加上autocomplete="off"这一项 以上这篇解决option标签selected="selected"属性失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家

  • 解决springboot的aop切面不起作用问题(失效的排查)

    检查下springboot的启动类是否开启扫描 @SpringBootApplication @ComponentScan(basePackages = {"com.zhangpu.springboot"}) 另外springboot默认开启的EnableAspectJAutoProxy为true 如果不放心可以增加: @EnableAspectJAutoProxy(proxyTargetClass=true) 第二种可能: 没有导入 相关的jar <dependency>

  • 解决SpringBoot中使用@Async注解失效的问题

    错误示例,同一个类中使用异步方法: package com.xqnode.learning.controller; import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springf

  • IDEA解决springboot热部署失效问题(推荐)

    一.什么是热部署? 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 二.什么是SpringBoot热部署? SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动项目. 有了SpringBoot热部署后大大提高了开发效率,因为频繁的重启项目,势必会浪费很多时间, 有了热部署后,妈妈再也不用担心我修改代码重启项目了~~~ 下面看下IDEA解决springboot热部署失效问题,IDEA实现springboot热部署详情如下: 在pom.xml文件中添加依赖

随机推荐