Hibernate @Column、columnDefinition等简介(注意日期类型)

2024-08-22 02:32

本文主要是介绍Hibernate @Column、columnDefinition等简介(注意日期类型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主要包括:

  1. @Id、@GeneratedValue
  2. @Column
  3. @Column之columnDefinition
  4. @Column控制浮点数精度
  5. @Temporal
  6. @Transient

 

 

@Id: 
@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。
@Id标注也可置于属性的getter方法之前。

@GeneratedValue: 
@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。 
在javax.persistence.GenerationType中定义了以下几种可供选择的策略: 
–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
–AUTO: JPA自动选择合适的策略,是默认选项; 
–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 
–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

推荐的两种写法: 
属性之上:

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {@GeneratedValue(strategy=GenerationType.AUTO)@Idprivate Integer id;private String name;private String email;private int age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}

 

 

getter方法之上

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {private Integer id;private String name;private String email;private int age;@GeneratedValue(strategy=GenerationType.AUTO)@Idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}

 但是不能某个注解在属性之上,某个注解在getter之上,将抛出异常,对其他注解也相同

 

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {@Idprivate Integer id;private String name;private String email;private int age;@GeneratedValue(strategy=GenerationType.AUTO)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}

 上面的写法是错误的

 

@Column: 
当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。
@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length 等。 
@Column 标注的columnDefinition属性: 表示该字段在数据库中的实际类型.通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将 String 类型映射到特定数据库的 BLOB 或TEXT字段类型.
@Column标注也可置于属性的getter方法之前

name属性: 
name属性定义了被标注字段在数据库表中所对应字段的名称

unique属性: 
unique属性表示该字段是否为唯一标识,默认为false。 
如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint,详情可参考@Table注解 详解

nullable属性: 
nullable属性表示该字段是否可以为null值,默认为true

insertable属性: 
insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值

updateable属性: 
updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值

insertable和updateable属性一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的

columnDefinition属性: 
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用 
如果数据库中表已经建好,该属性没有必要使用

table属性: 
table属性定义了包含当前字段的表名

length属性: 
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符

precision属性和scale属性: 
precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数

columnDefinition属性的使用:

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate Integer id;@Column(name = "Name")private String name;@Column(name = "Email",columnDefinition="varchar(128) not null")private String email;@Column(name = "Age")private int age;......
}
  数据库DDL:

 

 

CREATE TABLE `customers` (`ID` int(11) NOT NULL AUTO_INCREMENT,`Age` int(11) DEFAULT NULL,`Email` varchar(128) NOT NULL,`Name` varchar(255) DEFAULT NULL,PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空 

 

当然,相同的结果可以通过nullable和length属性结合实现

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate Integer id;@Column(name = "Name")private String name;@Column(name = "Email", nullable = true, length = 128)private String email;@Column(name = "Age")private int age;......
}

 数据库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,PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 

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;

 columnDefinition属性的特殊使用: 

 

编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate 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;}

 数据库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,PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 remark列数值类型是text,而Name和Email默认是varcahr

 

控制浮点精度:

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate 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类型将在数据库中映射为double类型,precision和scale属性无效 
2.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准 
3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效 
4.precision和scale属性只在BigDecimal类型中有效

在核心的JPA API中没有定义Date类型的精度,数据库中表示Date类型的数据有DATE,TIME,TIMESTAMP三种精度,可通过@Temporal注解进行调整

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate Integer id;@Column(name = "Name")private String name;@Column(name = "Email")private String email;@Column(name = "Age")private int age;@Temporal(TemporalType.DATE)@Column(name="Birthday")private Date birthday;@Temporal(TemporalType.TIMESTAMP)@Column(name="CreateTime")private Date createTime;}

 数据库DDL:

CREATE TABLE `customers` (`ID` int(11) NOT NULL AUTO_INCREMENT,`Age` int(11) DEFAULT NULL,`Birthday` date DEFAULT NULL,`CreateTime` datetime DEFAULT NULL,`Email` varchar(255) DEFAULT NULL,`Name` varchar(255) DEFAULT NULL,PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 当然@Column的columnDefinition属性也可以实现相同的效果

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate Integer id;@Column(name = "Name")private String name;@Column(name = "Email")private String email;@Column(name = "Age")private int age;@Column(name="Birthday",columnDefinition="date")private Date birthday;@Column(name="CreateTime",columnDefinition="datetime")private Date createTime;}

 @Transient: 

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic

当实体对象中有一些独有属性时,可以使用该注解,进行忽略

@Table(name = "CUSTOMERS")
@Entity
public class Customer {@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)@Idprivate Integer id;@Column(name = "Name")private String name;@Column(name = "Email")private String email;@Column(name = "Age")private int age;@Transientprivate String address;}

 数据库DDL:

CREATE TABLE `customers` (`ID` int(11) NOT NULL AUTO_INCREMENT,`Age` int(11) DEFAULT NULL,`Email` varchar(255) DEFAULT NULL,`Name` varchar(255) DEFAULT NULL,PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 数据库表中不会创建address列

 

转载地址:http://blog.csdn.net/Rickesy/article/category/6116937

这篇关于Hibernate @Column、columnDefinition等简介(注意日期类型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094980

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1