1. 程式人生 > >Hibernate不能自動建表

Hibernate不能自動建表

這是我第一天學習hibernate遇到的問題,糾結了一天終於解決了。

專案功能很簡單,就是儲存一條資料到資料庫。我完全照著尚矽谷佟剛老師的hibernate4.0的視訊寫的,結果執行一直出現找不到表的問題。

先看JUnit的Failure Trace報的錯

org.hibernate.exception.SQLGrammarException: could not execute statement
          at ......此處省略
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.news_table' doesn't exist
          at.......此處省略

我看到這個報錯後就像,既然找不到表嘛我就新建一個嘛,我在test資料庫下新建了一個news_table表,結果成功把資料新增進去了,而且我建的這個表只有部分欄位,缺的欄位它也補全了。原本我打算就此了事,結果往後的學習中我知道這表是自動生成的,而不是必須我手動在資料庫新建。所以我開始尋求這個問題的答案。

這裡我順便引申一下吧,在bibernate.cfg.xml配置檔案中的hibernate-configuration下的session-factory下新增<property name="hbm2ddl.auto">值</property>。值為以下四種
              create
每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。   create-drop : 每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。   update 最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate
時根據 model類自動 更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。 validate : 每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。
      我在網上搜了一下,遇到這個問題的人挺多的。有人回答說“把hibernate對映檔案中的catalog=hibernate屬性去掉”,結果我發現我沒有,所以不可能是這個原因。有人回答說“看一下對映檔案中的主鍵型別是不是java.lang.String,是的話改成java.lang.Integer”,我檢查了一下,我是用的Integer。有人回答說是“<property name="hbm2ddl.auto">update</property>”的問題,於是我試了一下換成create,結果還是不行,而且我試了下手動新建,結果這次不僅值沒插進去,反而給我把表刪掉了。有人說我肯定是哪個字串寫錯了,我檢查了幾遍都沒問題。還有人說版本不對,所以我換了很多版本,用hibernate-core-5.0.0.Final.jar的時候還出現了個org.hibernate.MappingException: Unknown entity:,所以都不知道原問題解決沒,其實應該是沒解決。真心沒法了。
     正當我準備放棄的時候,我在csdn上看到一篇文章,他提出了一個新的解決辦法,雖然他說他不知道為什麼。其實很簡單,就是資料庫方言設定有問題。
     Hibernate的底層仍然是用的SQL語句執行資料庫操作,雖然所有的關係型資料庫都支援SQL,但是不同的資料庫都進行了擴充套件,在語法上存在一定差異,舉例來說,我們在MySQL資料庫裡進行分頁查詢,只需使用limit關鍵字就可以了;而標準SQL並不支援limit關鍵字,例如Oracle則需要使用行內檢視的方式來進行分頁。所以Hibernate提供了指定資料庫方言的辦法。
使用<property name="dialect">方言</property>來設定方言,比如MySQL支援
1、org.hibernate.dialect.MySQLDialect;
2、org.hibernate.dialect.MySQLInnoDBDialect
3、org.hibernate.dialect.MySQLMyISAMDialect
三種方言,這個可以在hibernate-release-x.x.x.Final/project/etc/hibernate.properties檔案中查到。
     而我的錯誤在於照搬示例上用的org.hibernate.dialect.MySQLInnoDBDialect;方言。我改成org.hibernate.dialect.MySQLDialect;成功執行。方言的設定與資料庫版本也有關係,大家試著弄一個適合的吧,有時候還會涉及到事務的
支援與衝突。大家慢慢研究吧,新手的我渴望大家能給我一些指正和擴充套件。謝謝!

相關推薦

出現 Unable to instantiate default tuplizer,hibernate自動失敗,原因是在實體類中聲明瞭成員變數describe,而describe是mysql關鍵字

歡迎使用Markdown編輯器寫部落格 本Markdown編輯器使用StackEdit修改而來,用它寫部落格,將會帶來全新的體驗哦: Markdown和擴充套件Markdown簡潔的語法 程式碼塊高亮 圖片連結和圖片上傳 LaTex數學公式 UML序列圖和

hibernate自動 屬性填update 會報錯

自動建表 屬性填update 會報錯的解決方法 hibernate入門學習時,JUnit單元測試時,報錯 顯示以下錯誤: java.lang.ClassCastException: java.util.Collections$EmptyIte

Hibernate自動(使用DDL語句)

Gd上次和大家談到使用DDL語句實現自動建表失敗的問題,過了幾天再回頭看果然思路就變得清晰許多,原來是xxx.hbm.xml檔案的配置上出了問題,因為上次沒有用Junit進行測試,所以沒有看明白問題的描述,這裡不得不說一句,Junit真是個好東西,emmmmmm。Junit測

Springboot 之 Hibernate自動(Mysql)

本文章來自【知識林】 引入Maven依賴包 <dependency> <groupId>org.springframework.boot</groupI

hibernate自動到資料庫及spring下自動到資料庫

Hibernate支援自動建表,在開發階段很方便,可以保證hbm與資料庫表結構的自動同步。 如何使用呢?很簡單,只要在hibernate.cfg.xml里加上如下程式碼 Xml程式碼<prope

hibernate自動設定欄位型別為資料庫中為timestamp型別

1:專案需要,欄位應該設計為timestamp型別,但自動建表後總是被設定為datetime(當時用的資料庫為sqlserver) Google後,在配置檔案(Xxx.hbm.xml)中column新增 sql-type="timestamp" default="CUR

Hiberntate不能自動的問題:hibernate.(*)

寫代碼 dial ddl ber pro nta auto OS div 今天寫代碼的時候發現啟動服務器之後不能自動建表了?wtf什麽鬼?最後發現了這個問題: hbm2ddl.auto前的hibernate.省略之後出的問題,可能是bug之後的版本應該會修復 <pro

hibernate不能自動:MySQLSyntaxErrorException: Table '' doesn't exist

mysql mysql5 nat nta exist ble property cep exception 修改前: <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect<

hibernate通過pojo自動操作

1. 多對一 如球員和球隊的關係:多個球員在同一個球隊中。 1.1 類圖 TeamPojo:屬性 + set/get public class TeamPojo{ private Integer teamId; private String teamName; private String team

hibernate關閉自動

表結構和資料總是在程式執行的時候無端的修改,折騰了好長時間,查了很長時間hibernate的資料庫對映檔案和介面程式,始終沒有發現有什麼錯誤,到最後才發現了它!            <prop

Hibernate 不報錯卻不能自動

網上說有各種原因,什麼dialog配置不對了、jar包版本不相容了,但是我的原因卻不是。 之前配置檔案如下: <property name="hibernateProperties">

Hibernate不能自動

這是我第一天學習hibernate遇到的問題,糾結了一天終於解決了。 專案功能很簡單,就是儲存一條資料到資料庫。我完全照著尚矽谷佟剛老師的hibernate4.0的視訊寫的,結果執行一直出現找不到表的問題。 先看JUnit的Failure Trace報的錯 org.hibe

hibernate 根據註解好的實體類 自動

首先搭好框架   例如ssh然後  applicationContent.xml寫上這些<?xml version="1.0" encoding="UTF-8"?>    <property name="driverClass" value="com.mys

java中根據hibernate配置檔案自動

1、對與java專案,做資料庫遷移時,都會用的資料指令碼。 2、當引入hibernate時,可以建立資料庫表的配置檔案。可以根據表的配置檔案自動在資料庫建表。(資料庫要預先建立好,因為hibernate只會建表,不會建庫) 步驟: 1)、在配置檔案 hibernate.cf

在spring中配置hibernate.hbm2ddl.auto=true自動

今天 在spring中配置了 hibernate 的hibernate.hbm2ddl.auto 屬性為update ,配置資訊如下:     <property name="hibernateProperties"> <value> <!--

hibernate無法自動的原因

假如啟動hibernate,並且資料庫已經建好; 假如啟動的時候報錯,專案啟動失敗,大多數情況是不能自動建表,可以根據報錯資訊,解決問題; 這裡我要說的是另外一種情況,假如專案啟動沒有報錯,一切正常,但是資料庫依然沒有自動建表,這裡很有可能的原因是資料庫驅動版本過低的原因; 大家可以把搞個新點的資料庫驅動版

hibernate.hbm2ddl.auto為update無法自動

mysql5之前hibernate.dialect為org.hibernate.dialect.MySQLInnoDBDialect。 mysql5之後為org.hibernate.dialect.My

springboot+hibernate+mysql自動

引入Maven依賴包<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-j

hibernate 使用mysql6.0 無法自動的解決辦法

一句話,用的是mysql 的msi的安裝版 64 bit   大約 40來M 反正就是用盡了各種辦法,包括重啟myeclipse, 重新部署。 重啟電腦。 就是不行。 還是用了 mysql的5.7 大約200多M 安裝包,終於將問題解決。

IDEA建立springboot+hibernate+oracle自動遇到的問題

按照貫通的搭建模式  maven空專案+子模組,發現配置好 oracle  ,jpa依賴,yml檔案 配置好,實體類建好 ,自動建表失敗  後來發現原因  springboot載入時 是 預設當前路徑 或者上一級路徑下 ,  而springboot 專案是三維定位 ,