1. 程式人生 > >Hibernate之基本配置測試用例

Hibernate之基本配置測試用例

hibernate5.2.5入門例項

前幾天不知道怎麼下的一個Hibernate版本是hibernate-search-5.5.4.Final-dist,hibernate核心檔案為hibernate-core-5.0.9.Final.jar,有點坑。今天在公司下載的最新版為:hibernate-release-5.2.5.Final

先開始進行配置:

1.在src下建立hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC 
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

  <session-factory>
    <!-- 資料庫配置 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test_hibernate?useSSL=true</property>
    <property name="connection.username">root</property>
    <property name="connection.password">123</property>
    <!-- 資料庫方言根據選用的資料庫及版本在hibernate-core.jar的org.hibernate.dialect下對應,
        高版本資料庫可以選低版本資料庫方言 -->
    <property name="dialect">org.hibernate.dialect.MySQL57InnoDBDialect</property>
    <property name="show_sql">true</property><!-- 輸出sql語句 -->
    <property name="format_sql">true</property><!-- 格式化輸出sql語句 -->
    <property name="hbm2ddl.auto">update</property><!-- 自動建立|更新|驗證資料庫表結構 -->

    <mapping resource="com/ack/hibernate/User.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

hbm2ddl.auto(有四個值):
create :每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
update :最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
validate :啟動時驗證現有schema與你配置的hibernate是否一致,如果不一致就丟擲異常,並不做更新。

更多hibernate的配置暫且先不講。

2.User.java

package com.ack.hibernate;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
	private static final long serialVersionUID = -1886375452969338912L;

	private int id;
	private String userName;
	private String loginName;
	private String loginPassword;
	private Date birthday;
	private float salary;
	private String gender;
	private String status;
	
	public User(){
	}
	//getter setter方法省略,自己在eclipse或myeclipse右鍵Source-Generate Getters and Setters...就加上了
}

3.表結構:

DROP TABLE t_user;
CREATE TABLE t_user (
  id int(10) primary key auto_increment,
  user_name varchar(10),
  login_name varchar(20),
  login_password varchar(20),
  birthday date,
  salary float(7,2),
  gender char(2),
  status char(2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

USE test_hibernate;
insert into t_user values(1,'陳三','chensan','123','1992-02-29','200','1','1');
-- 測試建表正常,可操作資料

4.User.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <!-- 指定對應的實體類,對應的資料庫表 -->
  <class name="com.ack.sys.entity.User" table="t_user">
    <!-- 主鍵及主鍵生成策略 -->
	<id name="id">
		<generator class="identity"/>
	</id>
	
	<!-- 配置實體類屬性對應的資料庫表列,如果資料庫表列名與實體類屬性不同則需要用column指定列名 -->
	<property name="userName" column="user_name"/>
	<property name="loginName" column="login_name"/>
	<property name="loginPassword" column="login_password"/>
	<property name="birthday"/>
	<property name="salary"/>
	<property name="gender"/>
	<property name="status"/>
  </class>
</hibernate-mapping>

在hibernate.cfg.xml中加入此實體類對映檔案的mapping;

5.加log4j日誌(非必須,與hibernate無關,只是用來輸出日誌;這裡是個簡單的配置,後期會補上一篇自己之前整理過的log4j日誌設定)

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=springmvcoa.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
log4j.logger.com.ack=debug

6.HibernateTest.java

package com.ack.hibernate;

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateTest {

	public static void main(String[] args) {
		StandardServiceRegistry  serviceRegistry = new StandardServiceRegistryBuilder().configure().build();   
		SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();

		//取得session
		Session session = null;
		try {
			session = sessionFactory.openSession();
			//開啟事務
			session.beginTransaction();
			User user = new User();
			//user.setId(1);
			user.setUserName("陳三");
			user.setLoginName("chensan");
			user.setLoginPassword("123");
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			Date birthday = new	Date(df.parse("1992-02-29").getTime());
			user.setBirthday(birthday);
			user.setSalary(200);
			user.setGender("1");
			user.setStatus("1");
			
			//儲存User物件
			session.save(user);
			//提交事務
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			//回滾事務
			session.getTransaction().rollback();
		}finally {
			if (session != null) {
				if (session.isOpen()) {
					//關閉session
					session.close();
				}
			}
		}
	}
}

下面就是新增hibernate支援的jar包了,假設我們不知道要加哪些jar包,一步步根據錯誤提示來加JAR包;

首先hibernate的核心包hibernate-core.jar和mysql的jar包必須加。

這裡用到hibernate-release-5.2.5.Final版本,加入hibernate-core-5.2.5.Final.jar

加入mysql-connector-java-5.1.40-bin.jar

直接執行HibernateTest.java檔案中右鍵滑鼠 Run As/Java Application

報錯:Unsupported major.minor version 52.0 error

我這裡需要對應JDK1.8,裝一個就好了。

它們的對應關係為:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

MyEclipse6.5支援高版本的jdk需要另外配置,在Windows->Preferences->Java->Installed JREs新增jre8。

報錯:java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger

新增jboss-logging-3.3.0.Final.jar

報錯:java.lang.NoClassDefFoundError: org/dom4j/io/STAXEventReader

新增dom4j-1.6.1.jar

報錯:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ClassLoaderDelegate

新增hibernate-commons-annotations-5.0.1.Final.jar

報錯:java.lang.ClassNotFoundException: javax.persistence.SharedCacheMode

加入hibernate-jpa-2.1-api-1.0.0.Final.jar

報錯:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ‘[email protected]' to database 'test_hibernate'

未授權xxx使用者操作表的許可權:

grant all privileges on *.* to [email protected]'xxx';
flush privileges;

實際使用中根據實際情況來授權,不過開發環境給最大許可權就好了,省得麻煩。
繼續執行。

報錯:java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver

型別無法解析,加入classmate-1.3.0.jar

報錯:java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;

在hibernate-core-5.2.5.Final.jar根本找不到這方法。搞到這裡就崩潰了,半天一直沒解決。網上找不到答案,還有說是spring和hibernate一直的某個問題;也有網上什麼hibernate5.2.4的例項,說是隻要hibernate的require資料夾下的jar包,也按照他的例項來測試過,還是這個問題,因為hibernate-core.jar裡就沒有那個方法。

晚上回來,想了想之前按照hibernate-search-5.5.4裡jar包配置的例項沒問題。只是原來的版本太低,要換hibernate5.2出了一系列的鬼問題。將所有原來的jar包提到hibernate5.2.5對應版本。後來按報錯資訊,加了classmate-1.3.0.jar,例項成功執行。

最終JAR包:

junit和log4j的jar包不是必須的。

最後

向資料庫插入了一條語句:

到此hibernate5.2.5的例項算是完成了。

 

相關推薦

Hibernate基本配置試用

hibernate5.2.5入門例項 前幾天不知道怎麼下的一個Hibernate版本是hibernate-search-5.5.4.Final-dist,hibernate核心檔案為hibernate-core-5.0.9.Final.jar,有點坑。今天在公司下載的最新版

selenium批量執行試用

span stl def python3 text 指定 unit efault cnblogs 把寫好的測試用例放在指定目錄下,使用discover函數掃描該目錄,並根據關鍵字自動篩選需要執行的用例。本例使用Python3.6版本。 1 # 遍歷指定目錄,批量執行測試

quick-cocos2d-x 學習系列十四 試用

quick-cocos2d-x 學習系列之十四 測試用例                   定義變數,建立13個場景名字 &nbs

Tcl腳本調用高層API實現儀表使用和主機創建配置的自己主動化試用

sub ret eat ati 包含 lin name ref config #設置Chassis的基本參數,包含IP地址。port的數量等等 set chassisAddr 10.132.238.190 set islot 1 set portList {11 12

Java NIO ByteBuffer 試用

bytebuffer java 分享一下,關於ByteBuffer的一些非常基礎的測試用例package xingej.buffer.test001; import java.nio.ByteBuffer; //註意:1、原生JAVA NIO的ByteBuffer的緩沖區是不能添加字符串的,其實,從

postman系列批量執行接口試用

創建 狀態碼 失敗 響應頭 一個 IT postman 參數化 檢查 postman如何批量執行接口測試用例~其實很簡單,但是會給我們的工作帶來很多方便~ 比如我們寫了幾十個測試用例,請求都是同一個服務器IP,一旦服務器IP地址從測試環境搬到線上環境,需要修改所有的服務器I

Golangwait.Until 簡單試用

go routines wait.Until 測試目的,驗證wait.Until的用法 //測試wait.Until() 的用途 package main import ( "fmt" "k8s.io/apimachinery/pkg/util/wait" "time" )

軟體測試如何編寫單元試用

單元測試是以程式設計說明書為指導,測試模組範圍內的重要控制路徑,以揭露錯誤。 當程式編好以後,將它錄製在媒體上,或者直接由終端鍵盤輸入到機中進行除錯。測試的相對複雜性和所發現的錯誤受到單元測試所限定的範圍的限制。它在執行的過程中緊密的依照程式框架對模組進行測試(除錯),測試包含入口和出口的引數,輸入和輸出資

Android編寫試用

https://www.cnblogs.com/guop/p/5066400.html 測試是軟體工程中一個非常重要的環節,而測試用例又可以顯著地提高測試的效率和準確性。測試用例其實就是一段普通的程式程式碼,通常是帶有期望的執行結果的,測試者可以根據最終的執行結果來判斷程式是否能正常工作。

軟體測試 控制流圖 圈複雜度 獨立路徑 試用

例題:void Sort ( int  iRecordNum, int iType) 1 {  2    int x=0; 3    int y=0; 4    while ( iRecordNum > 0 ) 5    { 6       If( iType==0

Spring BootTestNG試用

一.前言 在Spring Boot提供的samples中,其中有一個spring-boot-sample-testng可供參考。 參考地址: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-sa

[Hibernate]註解/關係對映以及關係試用

基本註解package OneToOneSingle; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; impor

【Linux】程序間通訊(IPC)訊號量詳解與試用

學習環境centos6.5 Linux核心2.6 程序間通訊概述 1. 程序通訊機制 一般情況下,系統中執行著大量的程序,而每個程序之間並不是相互獨立的,有些程序之間經常需要互相傳遞訊息。但是每個程序在系統中都有自己的地址空間,作業系統通過頁表

【Linux】程序間通訊(IPC)訊息佇列詳解及試用

學習環境 Centos6.5 Linux 核心 2.6 什麼是訊息佇列? 訊息佇列是SystemV版本中三種程序通訊機制之一,另外兩種是訊號量和共享儲存段。訊息佇列提供了程序間傳送資料塊的方法,而且每個資料塊都有一個型別標識。訊息佇列是基於訊息的,而管

【Linux】程序間通訊(IPC)共享記憶體詳解與試用

學習環境centos6.5 Linux核心2.6 什麼是共享記憶體 共享記憶體允許兩個或更多程序訪問同一塊記憶體。當一個程序改變了這塊記憶體中的內容的的時候,其他程序都會察覺到這個更改。 效率: 因為所有程序共享同一塊記憶體,共享記憶體在各種程序

試用

功能 正常 配置 編輯 連接 限制 nbsp 我們 pan 日程管理 No. 測試用例 實際結果 期望結果 測試結果 Pass/Failed 備註 1. (1)測試內容: 設置歡迎界面,5秒後自動跳轉 到日程管理的主界面 (2)測試步驟: a.打開Andro

日程管理APP試用

nbsp 圖庫 代碼實現 符號 訪問 攝像 led height 測試用例 No. 測試用例 實際結果 期望結果 測試結果(Pass/Failed) 備註 1 輸入僅有數字或字母的用戶名及密碼,點擊註冊 註冊成功 註冊成功 Pass / 2 輸入含有特殊符

因果圖法設計試用

內容 splay 陰影 輸入 .cn 什麽 通過 -- tom 一、使用因果圖的好處 1 考慮了多個輸入之間的相互組合、相互制約關系 2 能夠幫助我們按一定步驟,高效率地選擇測試用例,同時還能為我們指出,程序規格說明描述中存在著什麽問題 二、利用因果圖導出測試用例需要

如何設計試用

交易 vivo 數據庫 tap 單點 個數 切換 統一 miui 測試用例設計方法 一、 Android系統功能測試設計的測試用例: a.對所測APP劃分模塊 b.詳細列出每個模塊的功能點(使用Xmind繪制功能圖) c.使用等價類劃分、邊界值、場景法等對各功能點編寫測試用

如何根據需求分析文檔編寫試用

編寫測試用例從拿到需求文檔不要立馬開始著手寫測試用例,需要仔細推敲整理需求,畫出系統級、模塊內流程圖,並找出各種測試點,等對需求進行了頭腦風暴般的整理之後,此時已對測試系統的功能很清楚了,再著手開始寫測試用例。那麽編寫測試用例的總體思路是什麽呢?1、整理分析需求文檔仔細將需求文檔閱讀一遍,記錄不明白的地方及關