Spring Data Jpa 實(shí)體類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗
先說(shuō)一下我遇到的這個(gè)問(wèn)題,首先我是通過(guò)maven創(chuàng)建了一個(gè)spring boot的工程,引入了Spring data jpa,結(jié)果實(shí)體類(lèi)創(chuàng)建好之后,運(yùn)行工程卻沒(méi)有在數(shù)據(jù)庫(kù)中自動(dòng)創(chuàng)建數(shù)據(jù)表。
找了半天發(fā)現(xiàn)是一個(gè)配置的問(wèn)題
hibernate.ddl-auto節(jié)點(diǎn)的配置,這個(gè)配置有兩種方式去配置,我使用的是通過(guò)properties文件去配置:
#DataSource Config spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:6033/data_service?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root spring.jpa.show-sql= true spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jackson.serialization.indent_output=false
hibernate.hbm2ddl.auto節(jié)點(diǎn)的值有幾個(gè)create、create-drop、update、validate、none
-
create
:每次加載hibernate會(huì)自動(dòng)創(chuàng)建表,以后啟動(dòng)會(huì)覆蓋之前的表,所以這個(gè)值基本不用,嚴(yán)重會(huì)導(dǎo)致的數(shù)據(jù)的丟失。 -
create-drop
: 每次加載hibernate時(shí)根據(jù)model類(lèi)生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除,下一次啟動(dòng)會(huì)重新創(chuàng)建。 -
update
:加載hibernate時(shí)根據(jù)實(shí)體類(lèi)model創(chuàng)建數(shù)據(jù)庫(kù)表,這是表名的依據(jù)是@Entity注解的值或者@Table注解的值,sessionFactory關(guān)閉表不會(huì)刪除,且下一次啟動(dòng)會(huì)根據(jù)實(shí)體model更新結(jié)構(gòu)或者有新的實(shí)體類(lèi)會(huì)創(chuàng)建新的表。 -
validate
:?jiǎn)?dòng)時(shí)驗(yàn)證表的結(jié)構(gòu),不會(huì)創(chuàng)建表 -
none
:?jiǎn)?dòng)時(shí)不做任何操作
可能導(dǎo)致JPA 無(wú)法自動(dòng)建表的問(wèn)題匯總
開(kāi)發(fā)某個(gè)個(gè)人項(xiàng)目時(shí)使用JPA自動(dòng)建表功能,運(yùn)行項(xiàng)目后無(wú)法自動(dòng)建表,也沒(méi)報(bào)錯(cuò),網(wǎng)上的各種方法都試了,折騰了一晚上也沒(méi)發(fā)現(xiàn)問(wèn)題。今早才發(fā)現(xiàn)了是自己的一個(gè)sb錯(cuò)誤。索性歸納一下可能導(dǎo)致JPA 無(wú)法自動(dòng)建表的問(wèn)題(mysql)。
1、沒(méi)加@Entity或引錯(cuò)Entity所在包
目標(biāo)實(shí)體類(lèi)前需加@Entity注解
所需Entity位于javax.persistence包下
2、jpa配置中ddl-auto未設(shè)置update
若ddl-auto為none,則程序無(wú)法對(duì)db進(jìn)行修改,需設(shè)置update或create。
若設(shè)update,則程序會(huì)對(duì)db中已有表進(jìn)行修改或未有表的創(chuàng)建;若設(shè)create,則會(huì)對(duì)db中的表進(jìn)行drop-create操作,慎設(shè)
注意yml中不要寫(xiě)錯(cuò)層級(jí),jpa直接位于spring下
3、實(shí)體類(lèi)的包不是啟動(dòng)程序所在包的子包
項(xiàng)目啟動(dòng)時(shí),框架會(huì)自動(dòng)掃描啟動(dòng)類(lèi)所在包的所有子包。因此,實(shí)體類(lèi)包應(yīng)為啟動(dòng)類(lèi)所在包的子包,如:
否則,需在啟動(dòng)類(lèi)前加EntityScan注解,標(biāo)明需掃描的實(shí)體包
4、mysql配置問(wèn)題
mysql6以上需導(dǎo)入com.mysql.cj.jdbc.Driver驅(qū)動(dòng),url后需補(bǔ)充一些參數(shù)
5、依賴(lài)不全
需引入:
等依賴(lài)
6、實(shí)體類(lèi)間關(guān)系錯(cuò)誤
實(shí)體間對(duì)應(yīng)關(guān)系弄錯(cuò),或mapby的屬性與對(duì)應(yīng)實(shí)體屬性名不一致(本人就是這個(gè)問(wèn)題),都會(huì)導(dǎo)致不建表,且項(xiàng)目啟動(dòng)時(shí)不報(bào)錯(cuò),運(yùn)行時(shí)可能報(bào)錯(cuò)
7、啟動(dòng)類(lèi)注解問(wèn)題
8、其他問(wèn)題
重啟mysql
實(shí)體類(lèi)的某些屬性名與mysql關(guān)鍵字相同
等等~
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/u010429286/article/details/52777046