JPA設(shè)置默認(rèn)字段及其長(zhǎng)度詳解
使用jpa去生成對(duì)應(yīng)的值的長(zhǎng)度和默認(rèn)值是如何設(shè)置的呢
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name() default "";
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0;
int scale() default 0;
}
- name 屬性用來(lái)設(shè)置字段的名字
- unique用于設(shè)置這個(gè)字段是否是是唯一的
- insertable和updatable、table都是和表更新相關(guān)的操作,
- length 指定長(zhǎng)度,默認(rèn)是255
- precision 數(shù)據(jù)長(zhǎng)度
- scale小數(shù)的長(zhǎng)度
- columnDefinition 指定這一列的信息
String
string是最常見(jiàn)的字段,
@Column(name = “name”) private String name;
SQL中 name varchar(255)
生成的字段長(zhǎng)度為255,即如果不設(shè)置長(zhǎng)度的話默認(rèn)的長(zhǎng)度就是255個(gè)。
@Column(name = “name”,length = 50) private String name;
name varchar(50)

@Column(name = “name”,columnDefinition=“varchar(11) COMMENT ‘用戶姓名'”) private String name;
name varchar(11) COMMENT ‘用戶姓名'

這里不僅指定了長(zhǎng)度,還給列了一個(gè)注釋,便于查看
@Column(name = “name”,columnDefinition=“default ‘12345'”) private String name;
如果我們制定默認(rèn)值,這樣SQL語(yǔ)句就會(huì)報(bào)錯(cuò)
create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB
如果我們制定長(zhǎng)度呢
@Column(name = “name”,columnDefinition=“default ‘12345'”,length = 25) private String name;
運(yùn)行的DDL語(yǔ)句依然無(wú)法創(chuàng)建出表
create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB
如何給String字段指定默認(rèn)值呢
所以如果指定columnDefinition這個(gè)屬性會(huì)覆蓋原來(lái)的列注解的長(zhǎng)度,而且在其注解的中必須制定列的類型
/**
* (Optional) The SQL fragment that is used when
* generating the DDL for the column.
* <p> Defaults to the generated SQL to create a
* column of the inferred type.
*/
String columnDefinition() default "";
/** *(可選)在以下情況下使用的SQL片段: *正在為列生成DDL。 *默認(rèn)使用生成的SQL來(lái)創(chuàng)建推斷類型的列。 */
@Column(name = “name”,columnDefinition=" varchar(11) default ‘12345'",length = 25) private String name; create table user (id bigint not null, age integer, birth datetime(6), name varchar(11) default ‘12345', sex bit, primary key (id)) engine=InnoDB
columnDefinition 會(huì)將其中的值作為列名之后,如果在這里設(shè)置默認(rèn)值,必須保證直接加在列名之后執(zhí)行不會(huì)出錯(cuò)。

定義 Integer 和 Long 有區(qū)別嗎


Long的默認(rèn)長(zhǎng)度為20,Integer的默認(rèn)長(zhǎng)度為11
定義Integer和int有區(qū)別嗎

區(qū)別是int如果你不給他設(shè)置就會(huì)默認(rèn)為0
boolean和Boolean也是一樣的。
boolean類型
默認(rèn)長(zhǎng)度為1
@Column(name = “sex”) private Boolean sex;

@Column(name = “sex”) private boolean sex;

二者沒(méi)有什么區(qū)別,如果我們將boolean設(shè)置默認(rèn)值并且設(shè)置長(zhǎng)度會(huì)咋樣呢?
@Column(name = “sex”,length = 50) private boolean sex;
生成的DDL語(yǔ)句中并沒(méi)有長(zhǎng)度的屬性。所以在boolean類型中設(shè)置長(zhǎng)度屬性是沒(méi)有作用的
create table user (id bigint not null, age integer, birth datetime(6), name varchar(255), sex bit, primary key (id)) engine=InnoDB
指定boolean類型的默認(rèn)值呢
@Column(name = “sex”,columnDefinition = “bit(1) default 1”) private boolean sex;

有注意,如果指定默認(rèn)值為1,即是true,屬性如果不指定,boolean的默認(rèn)值就是false,所以會(huì)將false設(shè)置到對(duì)應(yīng)的數(shù)據(jù)中,如果指定Boolean呢
如果指定Boolean的話,沒(méi)有設(shè)置默認(rèn)就是null,就會(huì)將空更新到數(shù)據(jù)庫(kù)中,最好用的方法還是在java類中設(shè)置默認(rèn)值。
日期
默認(rèn)的日期格式不具有可讀性
@Column(name = "birth") private Date birth;

使用@Temporal來(lái)制定格式
@Temporal(TemporalType.DATE) @Column(name = "birth") private Date birth;

@Temporal有三個(gè)值
- DATE 只有日期
- TIME 只有時(shí)間 時(shí)分秒
- TIMESTAMP 日期和時(shí)間都有
浮點(diǎn)數(shù)格式的設(shè)置
@Column(name = “age”,scale = 2) private int age;
age integer,屬性為scale = 2沒(méi)有作用
@Column(name = “age”,scale = 2) private float age;

@Column(name = “age”,precision = 5,scale = 2) private float age;
還是沒(méi)有用,指定數(shù)據(jù)格式為double,依然沒(méi)有用
@Column(name = “age”,columnDefinition = “decimal(5,2)”) private double age;

大文本
/** * 備注 */ @Basic(fetch = FetchType.LAZY) @Type(type = "text") @Lob @Column(name = "remark") private String remark;
@Lob 指定該文本為長(zhǎng)文本
@Basic(fetch = FetchType.LAZY) 長(zhǎng)文本緩加載,便于數(shù)據(jù)的讀取。?
以上就是JPA設(shè)置默認(rèn)字段及其長(zhǎng)度詳解的詳細(xì)內(nèi)容,更多關(guān)于JPA設(shè)置默認(rèn)字段及長(zhǎng)度的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中equals()方法重寫實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中equals()方法重寫實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例
這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
MyBatis查詢時(shí)屬性名和字段名不一致問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于MyBatis查詢時(shí)屬性名和字段名不一致問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java中對(duì)list分頁(yè)并顯示數(shù)據(jù)到頁(yè)面實(shí)例代碼
這篇文章主要介紹了java中對(duì)list分頁(yè)并顯示數(shù)據(jù)到頁(yè)面實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
舉例講解Java的Hibernate框架中的多對(duì)一和一對(duì)多映射
這篇文章主要介紹了Java的Hibernate框架中的多對(duì)一和一對(duì)多映射,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12
Java?Date(日期)對(duì)象進(jìn)行格式化的思路詳解
Date類是經(jīng)常會(huì)使用到的一個(gè)用來(lái)處理日期、時(shí)間的一個(gè)類。Date類是在java.util包下的Date類,這篇文章主要介紹了Java?Date(日期)對(duì)象如何進(jìn)行格式化呢,需要的朋友可以參考下2022-09-09
java通過(guò)方向鍵控制小球移動(dòng)的小游戲
這篇文章主要為大家詳細(xì)介紹了java通過(guò)方向鍵控制小球移動(dòng)的小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
IDEA2023創(chuàng)建MavenWeb項(xiàng)目并搭建Servlet工程的全過(guò)程
Maven提供了大量不同類型的Archetype模板,通過(guò)它們可以幫助用戶快速的創(chuàng)建Java項(xiàng)目,這篇文章主要給大家介紹了關(guān)于IDEA2023創(chuàng)建MavenWeb項(xiàng)目并搭建Servlet工程的相關(guān)資料,需要的朋友可以參考下2023-10-10
Java實(shí)現(xiàn)快速排序算法(Quicktsort)
這篇文章主要介紹了Java實(shí)現(xiàn)快速排序算法(Quicktsort),有需要的朋友可以參考一下2013-12-12
Java中基于Shiro,JWT實(shí)現(xiàn)微信小程序登錄完整例子及實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Java中基于Shiro,JWT實(shí)現(xiàn)微信小程序登錄完整例子 ,實(shí)現(xiàn)了小程序的自定義登陸,將自定義登陸態(tài)token返回給小程序作為登陸憑證。需要的朋友可以參考下2018-11-11

