SpringBoot項(xiàng)目使用Jpa時設(shè)置spring.jpa.hibernate.ddl-auto=update報錯

前言

問題描述

在springboot項(xiàng)目中使用springdata Jpa芭届,并且希望當(dāng)我的實(shí)體類發(fā)生了更改图呢,數(shù)據(jù)庫表結(jié)構(gòu)隨著實(shí)體類的改變而自動做出相應(yīng)的改變挣输。故在application.properties文件中設(shè)置屬性spring.jpa.hibernate.ddl-auto=update侮叮。然而在啟動的時候報錯较解,報錯信息如下:

com.microsoft.sqlserver.jdbc.SQLServerException: An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:259)
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:256)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:108)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:28)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:2754)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7344)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2713)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:2759)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.setCatalog(SQLServerConnection.java:3076)
    at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.switchCatalogs(SQLServerDatabaseMetaData.java:345)
    at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(SQLServerDatabaseMetaData.java:297)
    at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetWithProvidedColumnNames(SQLServerDatabaseMetaData.java:321)
    at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getTables(SQLServerDatabaseMetaData.java:493)
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.locateTableInNamespace(InformationExtractorJdbcDatabaseMetaDataImpl.java:339)
    ... 31 common frames omitted

技術(shù)棧

  1. springboot 1.5.6
  2. springdata jpa
  3. sqlServer2014

UserEntity實(shí)體類

@Entity
@Table(name = "user_entity", schema = "yueyue")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer uid;

    @Column(name = "username", columnDefinition = "varchar(255)", nullable = false)
    private String username;

    @Column(name = "password", columnDefinition = "varchar(255)", nullable = false)
    private String password;
}

application.yml

spring:
  datasource:
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      url: jdbc:sqlserver://localhost;databaseName=testdb;sendStringParametersAsUnicode=false
      username: sa
      password: Abcd1234
  jpa:
    hibernate:
      ddl-auto: update
      dialect: org.hibernate.dialect.SQLServer2012Dialect
    show-sql: true

解決思路

看拋出來的錯誤信息并不是很明顯知道錯誤在哪嚎花,我們還是debug進(jìn)代碼里面看具體做了什么操作寸痢,挑一個比較顯眼的方法打個斷點(diǎn)。這里我選擇at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(SQLServerDatabaseMetaData.java:297)這個方法紊选,這個方法的意思是通過調(diào)用存儲過程得到結(jié)果集啼止,錯誤信息顯示的是在297行,再進(jìn)入switchCatalogs方法兵罢。這段代碼的邏輯很清晰献烦,拿到當(dāng)前數(shù)據(jù)庫的catalog(默認(rèn)是數(shù)據(jù)庫名),然后和傳進(jìn)來的catalog做對比卖词,如果相同返回null巩那,如果不同就將數(shù)據(jù)庫的catalog設(shè)置成傳進(jìn)來的值吏夯,最后返回該值。

getResultSetFromStoredProc.png

在switchCatalogs方法中的第一行打上斷點(diǎn)即横,重新debug啟動springboot的引導(dǎo)類噪生,進(jìn)入到斷點(diǎn)里面,可以看到相應(yīng)的變量值东囚,我們傳進(jìn)來的catelog為空字符串跺嗽,所以執(zhí)行connection.setCatalog("")這句代碼,而數(shù)據(jù)庫的catalog是不允許為空的页藻,所以拋出SQLServerException桨嫁,就看到文章開頭的錯誤信息。

switchCatalogs.png
debug.png

解決方案

當(dāng)一切邏輯都很清晰時份帐,自然bug改起來也是省時省力璃吧。只需要在相應(yīng)的實(shí)體類@Table注解上加上catalog屬性就行了,這里我改成數(shù)據(jù)庫名废境。最后重啟app畜挨。

修改后的UserEntity

@Entity
@Table(name = "user_entity", schema = "yueyue", catalog = "testdb")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer uid;

    @Column(name = "username", columnDefinition = "varchar(255)", nullable = false)
    private String username;

    @Column(name = "password", columnDefinition = "varchar(255)", nullable = false)
    private String password;
}

總結(jié)

最后一個小小的總結(jié)作為本文的結(jié)束,使用springdata jpa時彬坏,如果希望實(shí)體類發(fā)生更改而數(shù)據(jù)庫表做出相應(yīng)的更改且不破壞數(shù)據(jù)庫現(xiàn)有的數(shù)據(jù),要將spring.jpa.hibernate.ddl-auto屬性值設(shè)置為update膝晾,同時需要在實(shí)體類上的@Table注解中加上catalog屬性栓始,值為數(shù)據(jù)庫名。
這里其實(shí)還是有一些小小的不足血当,就算你設(shè)置成update值幻赚,它也并不能識別你對數(shù)據(jù)庫表結(jié)構(gòu)的所有更改,它往往只能識別出你增加的字段臊旭,比如修改字段名落恼,修改字段類型或者刪除一個字段它都是不能夠識別的。
總的來說离熏,只是使用這個屬性值來對數(shù)據(jù)庫做版本控制是有很大的局限性的佳谦。在實(shí)際開發(fā)中,我們更多會用到flyway這個工具滋戳,這里就不再做多闡述钻蔑。

thanks for reading,see u next time~~~

wangyue

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奸鸯,隨后出現(xiàn)的幾起案子咪笑,更是在濱河造成了極大的恐慌,老刑警劉巖娄涩,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗怒,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扬虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門努隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孔轴,你說我怎么就攤上這事剃法。” “怎么了路鹰?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵贷洲,是天一觀的道長。 經(jīng)常有香客問我晋柱,道長优构,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任雁竞,我火速辦了婚禮钦椭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碑诉。我一直安慰自己彪腔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布进栽。 她就那樣靜靜地躺著德挣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪快毛。 梳的紋絲不亂的頭發(fā)上格嗅,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音唠帝,去河邊找鬼屯掖。 笑死,一個胖子當(dāng)著我的面吹牛襟衰,可吹牛的內(nèi)容都是我干的贴铜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瀑晒,長吁一口氣:“原來是場噩夢啊……” “哼阀湿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瑰妄,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陷嘴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后间坐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灾挨,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邑退,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了劳澄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地技。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秒拔,靈堂內(nèi)的尸體忽然破棺而出莫矗,到底是詐尸還是另有隱情,我是刑警寧澤砂缩,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布作谚,位于F島的核電站,受9級特大地震影響庵芭,放射性物質(zhì)發(fā)生泄漏妹懒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一双吆、第九天 我趴在偏房一處隱蔽的房頂上張望眨唬。 院中可真熱鬧,春花似錦好乐、人聲如沸匾竿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岭妖。三九已至,卻和暖如春笛坦,著一層夾襖步出監(jiān)牢的瞬間区转,已是汗流浹背苔巨。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工版扩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侄泽。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓礁芦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悼尾。 傳聞我的和親對象是個殘疾皇子柿扣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 離開父母(二)間斷微距離開2 我容易聚焦自己不理想的地方,忽視了好的地方闺魏,而我的兄弟卻相反最容易看到自身優(yōu)勢...
    肖成燕閱讀 380評論 2 1
  • 黃國標(biāo) “如果你厭倦了倫敦未状,你就厭倦了生活∥銮牛”在倫敦過生活司草,有不一樣的精致和感悟艰垂。 ...
    二屏大叔閱讀 299評論 0 3
  • #生命力 今天做冥想練習(xí)的時候,聽到一個孩子隱隱的哭聲埋虹。有些含糊猜憎,聽不清。 不知是否相識搔课,但惻隱心大起動念胰柑。所以冥...
    果大喵喵閱讀 250評論 0 0