1. 程式人生 > >使用Spring整合Hibernate出現無法自動建立表的問題

使用Spring整合Hibernate出現無法自動建立表的問題

在使用Spring整合Hibernate時,出現一個莫名其妙的問題,Spring整合Hibernate出現無法自動建立表,花了好幾個小時也沒有查詢是怎麼回事。具體如下:

1、在Hibernate配置檔案中設定了:

<property name="hibernate.hbm2ddl.auto">update</property>

在Junit測試中程式碼是:

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());
	}

}
在applicationContext中是:
<?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容器就會