springboot中使用jpa下hibernate的ddl-auto方式
使用jpa下hibernate的ddl-auto
今天做一個(gè)報(bào)表的功能,發(fā)現(xiàn)一個(gè)表中的shopProductId都為null,但在程序中判斷用的是shopProductId,而且表中有productId不為null,在查找原因的途中,才得知是有人將productId改為了shopProductId,但是數(shù)據(jù)沒(méi)有更新過(guò)去。
遇到這種情況,我們?cè)趺茨懿榭吹侥承┳侄伪桓淖兞四兀?/strong>
由于我們用的框架是springBoot+jap-hibernate,然后在jpa下的hibernate,在application配置文件中,有
ddl-auto的配置
ddl-auto:create每次運(yùn)行該程序,沒(méi)有表格會(huì)新建表格,表內(nèi)有數(shù)據(jù)會(huì)清空ddl-auto:create-drop每次程序結(jié)束的時(shí)候會(huì)清空表ddl-auto:update每次運(yùn)行程序,沒(méi)有表格會(huì)新建表格,表內(nèi)有數(shù)據(jù)不會(huì)清空,只會(huì)更新ddl-auto:validate運(yùn)行程序會(huì)校驗(yàn)數(shù)據(jù)與數(shù)據(jù)庫(kù)的字段類型是否相同,不同會(huì)報(bào)錯(cuò)
把ddl-auto改為validate時(shí),我們啟動(dòng)項(xiàng)目時(shí),會(huì)提示哪一個(gè)字段被更改,這樣我們?cè)诎l(fā)布上線時(shí),會(huì)及時(shí)發(fā)現(xiàn),不至于出現(xiàn)錯(cuò)誤。而正常運(yùn)行的時(shí)候,一般設(shè)置為update屬性。
spring.jpa.hibernate.ddl-auto的配置
spring.jpa.hibernate.ddl-auto 可以顯式設(shè)置 spring.jpa.hibernate.ddl-auto ,
標(biāo)準(zhǔn)的Hibernate屬性值有 none,validate,update,create,create-drop。
Spring Boot 會(huì)根據(jù)數(shù)據(jù)庫(kù)是否是內(nèi)嵌類型,選擇一個(gè)默認(rèn)值。
具體的關(guān)系見(jiàn)下
| 內(nèi)嵌類型 | 數(shù)據(jù)庫(kù)名稱 | 默認(rèn)值 |
|---|---|---|
| 內(nèi)嵌 | hsqldb, h2, derby | create-drop |
| 非內(nèi)嵌 | 其他數(shù)據(jù)庫(kù) | none |
spring.jpa.hibernate.ddl-auto的四個(gè)屬性的含義見(jiàn)下表:
| 屬性值 | 作用 |
|---|---|
| create | 每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒(méi)有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的一個(gè)重要原因。 |
| create-drop | 每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。 |
| update | 最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫(kù)),以后加載hibernate時(shí)根據(jù) model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。 |
| validate | 每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。 |
此外,啟動(dòng)時(shí)處于classpath根目錄下的 import.sql文件會(huì)被執(zhí)行(前提是ddl-auto屬性被設(shè)置為 create 或create-drop)。這在demos或測(cè)試時(shí)很有用,但在生產(chǎn)環(huán)境中可能不期望這樣。
這是Hibernate的特性,和Spring沒(méi)有一點(diǎn)關(guān)系。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java位集合之BitMap、BitSet和布隆過(guò)濾器示例解析
這篇文章主要介紹了Java中位集合的基本概念、實(shí)現(xiàn)方法以及應(yīng)用場(chǎng)景,包括Bit-Map、BitSet和BloomFilter,Bit-Map通過(guò)位操作高效地存儲(chǔ)和查詢?cè)貭顟B(tài),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
java基于servlet實(shí)現(xiàn)文件上傳功能解析
這篇文章主要為大家詳細(xì)介紹了java基于servlet實(shí)現(xiàn)上傳功能,后臺(tái)使用java實(shí)現(xiàn),前端主要是js的ajax實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-05-05
淺析Java數(shù)據(jù)庫(kù)操作工具包jOOQ的使用
jOOQ?是一個(gè)輕量級(jí)的?Java?ORM(對(duì)象關(guān)系映射)框架,可用來(lái)構(gòu)建復(fù)雜的?SQL?查詢,這篇文章主要來(lái)和大家介紹一下jOOQ的使用,需要的可以參考下2024-04-04
關(guān)于IDEA的junit單元測(cè)試Scanner輸入不可用的問(wèn)題(多種原因分析)
IDEA在Junit測(cè)試中使用了Scanner,但是控制臺(tái)一直轉(zhuǎn)圈,無(wú)法輸入,eclipse默認(rèn)可用,其實(shí)解決方法很多,今天小編給大家分享多種問(wèn)題原因分析及解決方法,感興趣的朋友一起看看吧2021-06-06
Java 前臺(tái)加后臺(tái)精品圖書(shū)管理系統(tǒng)的實(shí)現(xiàn)
相信每一個(gè)學(xué)生學(xué)編程的時(shí)候,應(yīng)該都會(huì)寫(xiě)一個(gè)小項(xiàng)目——圖書(shū)管理系統(tǒng)。為什么這么說(shuō)呢?我認(rèn)為一個(gè)學(xué)校的氛圍很大一部分可以從圖書(shū)館的氛圍看出來(lái),而圖書(shū)管理系統(tǒng)這個(gè)不大不小的項(xiàng)目,接觸的多,也比較熟悉,不會(huì)有陌生感,能夠練手,又有些難度,所以我的小項(xiàng)目也來(lái)了2021-11-11
如何利用Spring把元素解析成BeanDefinition對(duì)象
這篇文章主要介紹了如何利用Spring把元素解析成BeanDefinition對(duì)象,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08

