使用Spring整合Hibernate出現無法自動建立表的問題
在使用Spring整合Hibernate時,出現一個莫名其妙的問題,Spring整合Hibernate出現無法自動建立表,花了好幾個小時也沒有查詢是怎麼回事。具體如下:
1、在Hibernate配置檔案中設定了:
<property name="hibernate.hbm2ddl.auto">update</property>
在Junit測試中程式碼是:
在applicationContext中是:public class SpringHibernateTest extends TestCase { private ApplicationContext context = null; { context = new ClassPathXmlApplicationContext("appicationContext.xml"); } @Test public void testDataSource() throws SQLException { DataSource dataSource = (DataSource) context.getBean("dataSource"); System.out.println(dataSource.getConnection()); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 讀取資料來源配置 --> <context:property-placeholder location="classpath:mysql.properties"/> <!-- 資料來源bean --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}"></property> <property name="password" value="${password}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSize}"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <property name="mappingLocations" value="classpath:/com/yefeng/spring/spring5/*.hbm.xml"></property> </bean> </beans>
update意思第一次沒有表的時候,自動建立表。但是我在執行測試程式碼時,發現沒能建立表。然後我換成create,發現也沒有建表。搜尋這個hibernate.hbm2ddl.auto的問題,發現並沒有找到解決方法。
2、仔細查看了輸出顯示的結果,發現下面顯示中可能是關鍵所在:
七月 06, 2016 10:31:17 上午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.1.Final}
七月 06, 2016 10:31:17 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
七月 06, 2016 10:31:17 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
七月 06, 2016 10:31:17 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
說是hibernate的屬性檔案沒有找到。但是以上applicationContext中確實都配置了,因為Juint中有輸出,顯示已經連線成功,因此不可能是Hibernate.cfg.xml的錯誤,因此懷疑是*.hbm.xml路徑寫錯了。
3、帶著懷疑的態度,我嘗試修改了其中的Account.hbm.xml,將其中的id name屬性改成一個錯誤的值("id"改為"myid")。
<hibernate-mapping>
<class name="com.yefeng.spring.spring5.Account" table="SH_ACCOUNT">
<id name="myid" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="money" type="int">
<column name="MONEY" />
</property>
</class>
</hibernate-mapping>
結果發現並沒有報錯。問題就出在設定mappingLocations屬性。此時的設定為:
<property name="mappingLocations" value="classpath:/com/yefeng/spring/spring5/*.hbm.xml"></property>
仔細檢查了一遍,發現並沒有錯誤。嘗試換了一種寫法,如下:
<property name="mappingLocations">
<list>
<value>classpath:com/yefeng/spring/spring5/Account.hbm.xml</value>
<value>classpath:com/yefeng/spring/spring5/Book.hbm.xml</value>
</list>
</property>
出乎意料的是,居然成功了。懷疑是*萬用字元的問題,又嘗試了一種方式:
<property name="mappingLocations" value="classpath*:com/yefeng/spring/spring5/*.hbm.xml"></property>
發現此時也能成功建立表,結果是這樣:
INFO: HHH000262: Table not found: SH_ACCOUNT
Hibernate:
create table SH_ACCOUNT (
ID integer not null auto_increment,
NAME varchar(255),
MONEY integer,
primary key (ID)
) ENGINE=InnoDB
七月 06, 2016 10:45:15 上午 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: SH_BOOK
Hibernate:
create table SH_BOOK (
ID integer not null auto_increment,
BOOKNAME varchar(255),
ISBN integer,
PRICE integer,
NUMBER integer,
primary key (ID)
) ENGINE=InnoDB
[email protected]
但此時發現以上的那個提示照樣存在:
七月 06, 2016 10:45:14 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
七月 06, 2016 10:45:14 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
到現在配置是能用了,但關於mappingLocations的萬用字元方式引起的問題,並沒有找到原因。
4、總結可以執行的方式:
方式1:
<property name="mappingLocations">
<list>
<value>classpath:com/yefeng/spring/spring5/Account.hbm.xml</value>
<value>classpath:com/yefeng/spring/spring5/Book.hbm.xml</value>
</list>
</property>
方式2,和出錯配置方法僅在classpath後多了一個*:
<property name="mappingLocations" value="classpath*:com/yefeng/spring/spring5/*.hbm.xml"></property>
出錯配置方式:<property name="mappingLocations" value="classpath:/com/yefeng/spring/spring5/*.hbm.xml"></property>
相關推薦
使用Spring整合Hibernate出現無法自動建立表的問題
在使用Spring整合Hibernate時,出現一個莫名其妙的問題,Spring整合Hibernate出現無法自動建立表,花了好幾個小時也沒有查詢是怎麼回事。具體如下: 1、在Hibernate配置檔
Spring 整合hibernate 無法自動建立表,控制檯沒有報錯
症狀 Spring 整合hibernate 無法自動建立表,控制檯沒有報錯 百度了幾天了 主要有一下幾個原因 1、 注意name="hibernate.dialect" 而不能是name="dialect" &n
Spring整合Hibernate後沒有自動在資料庫中建立表結構
Hibernate配置檔案hibernate.cfg.xml中關於SessionFactory節點配置通常如下: <session-factory> <!-- Database connection settings --> <proper
關於 Hibernate 5.1.x 無法自動建立表問題
最近遇到了一個問題。在學習使用 Hibernate 5.1.x 版本中, hbm2ddl.auto -> update 無法建立新表,用 JUnit 單元測試報錯,表不存在。 排查過程中發現如下 INFO: HHH10001501: Connection obtai
hibernate auto=update 還是無法自動建立表的原因
是因為這個屬性的配置:對映目錄要比實際少一層! <property name="packagesToScan"> <list><!-- 注意:配置對映目錄要比實際少一層
使用Spring整合Hibernate配置,根據實體類自動建立表
<?xml version="1.0" encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan
Spring整合Hibernate註解配置 無hibernate.cfg.xml檔案,自動生成表配置
本以為一個無足掛齒的小問題,沒想到還折騰了一下。遂記錄一下。主要搜尋出的結果排名靠前的大多是在hibernate.cfg.xml中的配置方式。與我的環境不符。正確配置方式如下。已測試。 <bean id= "sessionFactor
Spring Data Jpa + Mysql實體類自動建立表時出現錯誤
實體類Param,設定表名為vbap3_sql_param,在執行之後,出現錯誤,錯誤的建表語句如下。(資料庫是用的Mysql) create table vbap3_sql_param (id bi
Hibernate無法自動建立資料庫表
今天在學習Hibernate的時候,通過JavaBean實體類和hbm對映檔案自動建立資料庫表,實體類和物件關係對映檔案寫的都沒有錯誤,執行時也不報錯,但是就是沒生成資料庫表,查了半天才發現是因為 hibernate.cfg.xml檔案中缺少了一個自動建立資料庫表的語句:
Spring Boot Jpa無法自動生成表
一.問題描述 初學Spring Boot今天遇到一個問題,在使用Jpa的方式建立資料庫表的時候發現無論如何建立不成功。(注意:首先你得保證你的Project能夠連線資料庫,連不上資料庫就別瞎折騰了,我用的IDEA,有對應的測試方法)二.踩過的坑 參考了網上將啟動類
Spring Data JPA 配置資料庫表根據實體屬性自動建立表結構
一、實體屬性 @Entity(name = "recommend_lottery") public class Student{@Id@Column(name = "id", nullable = false)private String id; // id@Column(
解決Hibernate不能自動建立資料庫表的問題
HibernateTest(測試類):package club.mochunrong.hibernate.test; import java.io.PrintStream; import club.mochunrong.hibernate.bean.User; impor
使用SSH Hibernate自動建立表的問題:Could not parse mapping document from input stream
在我們開始學習Hibernate的時候,我們找到Hibernate可以幫助我們自動建立資料庫表,但前提是我們必須配置這個屬性:<property name="hbm2ddl.auto">u
Hibernate學習筆記(一)之——根據配置檔案自動建立表的兩種方式(註解方式和配置檔案方式)
環境準備:jdk eclipse hibernate、mysql jar包 專案截圖: Student是根據配置檔案建立表,Teacher是根據註解建立表 Student.java package com.java1234.model; publi
hibernate無法自動建表的原因
假如啟動hibernate,並且資料庫已經建好; 假如啟動的時候報錯,專案啟動失敗,大多數情況是不能自動建表,可以根據報錯資訊,解決問題; 這裡我要說的是另外一種情況,假如專案啟動沒有報錯,一切正常,但是資料庫依然沒有自動建表,這裡很有可能的原因是資料庫驅動版本過低的原因; 大家可以把搞個新點的資料庫驅動版
hibernate.hbm2ddl.auto為update無法自動建表
mysql5之前hibernate.dialect為org.hibernate.dialect.MySQLInnoDBDialect。 mysql5之後為org.hibernate.dialect.My
A.CTable開源框架Mybatis增強自動建立表/更新表結構/實現類似hibernate共通的增刪改查
mybatis-enhance-actable-0.0.1 不用再為mybatis無法自動建立表,不提供基本的增刪改查而苦惱啦!有了A.CTable這將不再成為你苦惱的理由,而且學習簡單,只要進行簡單的配置,然後稍微看下原始碼註解就可以上手了,A.CTable
Hibernate自動建立表
Hibernate支援自動建表,在開發階段很方便,可以保證hbm與資料庫表結構的自動同步。 一、通過Hibernate的ShemaExport來建立 1)實體類 package com.xiaomo.vo; public class User {private in
hibernate 使用mysql6.0 無法自動建表的解決辦法
一句話,用的是mysql 的msi的安裝版 64 bit 大約 40來M 反正就是用盡了各種辦法,包括重啟myeclipse, 重新部署。 重啟電腦。 就是不行。 還是用了 mysql的5.7 大約200多M 安裝包,終於將問題解決。
使用Spring時出現無法自動裝配的問題
問題描述 在使用Spring進行自動裝配的時候(尤其是裝配介面的時候),有時會出現裝配失效的問題,使用@ComponentScan註解也無法完成 解決方案 修改包結構。 將SpringBootApplication放置到頂級根目錄下,這樣Spring容器就會