精通hibernate-Hibernate 5.X的使用概述與示例(轉)


Hibernate的更新有時讓人覺得反復無常,當我們在Hibernate3習慣使用conf.buildSessionFactory();時,在Hibernate4中又推薦使用ServiceRegistry來創建:configuration.buildSessionFactory(serviceRegistry)原有的buildSessionFactory()方法被Deprecated;到了Hibernate5似乎又改了,真是隨性,坑了主動更新的小白們。

這次復習博客系列就順帶着從入門到高級,按照Hibernate5的新特性整理一遍。

一張圖回顧Hibernate使用的四大步驟:

Step 1.創建一個hibernate配置文件

包含hibernate運行的最基本的信息。比如,連接數據庫的user和password,java class,url,數據庫使用的方言Dialect。

Step 2.創建持久化類

Step 3.創建 對象-關系 映射文件

這個是ORM框架的核心基礎,定義了應用實體類對應於數據庫的哪一張表,屬性與哪一個字段對應。
Step 4.通過Hibernate API 編寫訪問數據庫的代碼

(本文出自:https://my.oschina.net/happyBKs/blog/821006,禁 止 轉 載)

下面我們逐步來看:

Step 1.創建一個hibernate配置文件

new一個文件,安裝了jbosstools-4.4.2.Final-updatesite-core.zip之后(方法參考本系列上一篇博客),我們就可以方便的使用自帶的Hibernate配置文件了,里面會自動為我們生成我們需要的xml標簽。按照向導做即可。

 

這里我們配置數據庫連接的幾個基本信息,一會兒會插件為幫我們自動插入到xml配置文件中。

完成后如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/happybksdb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    </session-factory>
</hibernate-configuration>

 

看,在向導的幫助下,配置項被自動生成了。並且各個配置項都帶有前綴,這些在單單使用hibernate時並不是必須的,但是在hibernate與spring集成時確實必須的。

 

比如mysql和oracle的方言在處理分頁時就不一樣,mysql是limit,oracle是row_number。

數據庫種類的不同、版本的不同、引擎的不同,都需要我們通過方言的定義來告訴hibernate。

你可以通過查找hibernate源碼中的一個配置文件(project/etc/hibernate.properties)里面羅列了可供配置的各個數據庫的數據庫方言的生命形式。這里羅列出來,方便日后查找復制。

DB2 org.hibernate.dialect.DB2Dialect 
DB2 AS/400 org.hibernate.dialect.DB2400Dialect 
DB2 OS390 org.hibernate.dialect.DB2390Dialect 
PostgreSQL org.hibernate.dialect.PostgreSQLDialect 
MySQL org.hibernate.dialect.MySQLDialect 
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect 
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect 
Oracle (any version) org.hibernate.dialect.OracleDialect 
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect 
Sybase org.hibernate.dialect.SybaseDialect 
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect 
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect 
SAP DB org.hibernate.dialect.SAPDBDialect 
Informix org.hibernate.dialect.InformixDialect 
HypersonicSQL org.hibernate.dialect.HSQLDialect 
Ingres org.hibernate.dialect.IngresDialect 
Progress org.hibernate.dialect.ProgressDialect 
Mckoi SQL org.hibernate.dialect.MckoiDialect 
Interbase org.hibernate.dialect.InterbaseDialect 
Pointbase org.hibernate.dialect.PointbaseDialect 
FrontBase org.hibernate.dialect.FrontbaseDialect 
Firebird org.hibernate.dialect.FirebirdDialect 

然后我們在剛才自動生成的hibernate.cfg.xml基礎上再追加一些基本配置,十分有用。

注意:我們這里已經引用了http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd,所以我們編輯hibernate.cfg.xml會自動提示。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
    	<!-- 配置鏈接數據庫的信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/happybksdb?serverTimezone=UTC&amp;characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!-- 配置hibernate的基本信息 -->
        <!-- hibernate所使用的的數據庫方言  -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!--  執行操作是否在控制台打印SQL -->
        <property name="show_sql">true</property>
        
        <!-- 是否對SQL進行格式化 -->
        <property name="format_sql">true</property>
        
        <!-- 指定自動生成數據表的策略:在運行數據庫的時候hibernate會為我們在數據庫自動生成數據表的策略 -->
        <property name="hbm2ddl.auto">update</property>
        
        <!-- 指定關聯的hbm.xml映射文件 -->
        <mapping resource="com/happybks/hibernate/hibernatePro/beans/CuntomerBean.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

這里需要注意,url被聲明為

jdbc:mysql://localhost:3306/happybksdb?serverTimezone=UTC&amp;characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false

這后面加入的參數是必須要的:

characterEncoding=utf8設置了編碼,這個無需多言。

serverTimezone等也是不可少的,否則你在創建SessionFactory時會報錯:

Caused by: java.sql.SQLException: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

還要需要注意的是url中參數之間應該是&符號分割,但是卸載xml中時,由於&有特殊意義。所以需要轉義,需要寫成&amp;,否則會報錯:

Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[9,126]
Message: 對實體 "characterEncoding" 的引用必須以 ';' 分隔符結尾。

 

Step 2.創建持久化類

這里隨便寫了一個,注意,我這里沒有使用注解方式,本文先以映射文件的方式來介紹。

package com.happybks.hibernate.hibernatePro.beans;

import java.sql.Date;
import java.sql.Timestamp;

public class CuntomerBean {

	private String name;
	private Integer no;
	private Integer cid;
	private Long score;
	private double money;
	private Date registerDate;
	private Timestamp loginTime;


	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getNo() {
		return no;
	}
	public void setNo(Integer no) {
		this.no = no;
	}
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public Long getScore() {
		return score;
	}
	public void setScore(Long score) {
		this.score = score;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	public Date getRegisterDate() {
		return registerDate;
	}
	public void setRegisterDate(Date registerDate) {
		this.registerDate = registerDate;
	}
	public Timestamp getLoginTime() {
		return loginTime;
	}
	public void setLoginTime(Timestamp loginTime) {
		this.loginTime = loginTime;
	}

	public CuntomerBean() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "CuntomerBean [name=" + name + ", no=" + no + ", cid=" + cid + ", score=" + score + ", money=" + money
				+ ", registerDate=" + registerDate + ", loginTime=" + loginTime + "]";
	}

	

	
	
}

這里,我將例子中的各個字段涵蓋了常用的各個數據類型。並且,我有意將id字段命名成cid,成員變量和屬性get、set方法的順序我也將其放到了第三位,cid也不是第一個Integer的屬性(位置第一個Integer類型的屬性是no),看看等會自動生成映射文件時會發生什么。

 

Step 3.創建 對象-關系 映射文件

這個應該是ORM框架的核心,建立應用實體類與數據庫關系表之間的映射。

方式有兩種,一種是通過映射文件,一種是通過注解的方式。本文先只介紹映射文件的方式。我們安裝了jbosstools-4.4.2.Final-updatesite-core.zip就是方便,Hibernate XML Mapping file 可以自動生成。想當年剛剛自學Hibernate的時候,還傻傻地自己寫Hibernate映射文件,總是一不小心寫錯某個小地方而導致運行錯誤,找錯找一上午,一段令人懷念的時光。

現在操作如下:

 

 

看,自己跑出來了。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-1-8 11:45:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.happybks.hibernate.hibernatePro.beans.CuntomerBean" table="CUNTOMERBEAN">
        <id name="cid" type="java.lang.Integer">
            <column name="CID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="no" type="java.lang.Integer">
            <column name="NO" />
        </property>
        <property name="score" type="java.lang.Long">
            <column name="SCORE" />
        </property>
        <property name="money" type="double">
            <column name="MONEY" />
        </property>
        <property name="registerDate" type="java.sql.Date">
            <column name="REGISTERDATE" />
        </property>
        <property name="loginTime" type="java.sql.Timestamp">
            <column name="LOGINTIME" />
        </property>
    </class>
</hibernate-mapping>

值得注意的是,JBOSS的這個給eclipse的hibernate插件很智能地把cid設置成了主鍵。看來無論你的實體類定義中主鍵對應的getset屬性方法、成員變量的位置是否是第一個,或者說Integer類型的第一個,只要屬性的名字中帶有id,都會被默認設置成為映射文件的主鍵id。

這里我們希望主鍵能夠自己生成,所以做了修改。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-1-8 11:45:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.happybks.hibernate.hibernatePro.beans.CuntomerBean" table="CUNTOMERBEAN">
        <id name="cid" type="java.lang.Integer">
            <column name="CID" />
            <!-- 指定主鍵的生成方式 :native使用數據庫本地的生成方式-->
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="no" type="java.lang.Integer">
            <column name="NO" />
        </property>
        <property name="score" type="java.lang.Long">
            <column name="SCORE" />
        </property>
        <property name="money" type="double">
            <column name="MONEY" />
        </property>
        <property name="registerDate" type="java.sql.Date">
            <column name="REGISTERDATE" />
        </property>
        <property name="loginTime" type="java.sql.Timestamp">
            <column name="LOGINTIME" />
        </property>
    </class>
</hibernate-mapping>

native代表數據庫自己生成。但不同數據庫的生成方式不同,比如:

mysql用的是auto-increment,SQLServer用的是identity,oracle用的是序列

我們定義方言時,其實也是在告訴hibernate,在屬性聲明為native時,如何按照不同的數據庫實現賦予主鍵值的方式。其他很多地方也是雷同。

然后,我們需要將我們添加的映射文件.hbm.xml添加到hibernate配置文件.cfg.cml中。這里我寫的是目錄結構路徑。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
    	<!-- 配置鏈接數據庫的信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/happybksdb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!-- 配置hibernate的基本信息 -->
        <!-- hibernate所使用的的數據庫方言  -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!--  執行操作是否在控制台打印SQL -->
        <property name="show_sql">true</property>
        
        <!-- 是否對SQL進行格式化 -->
        <property name="format_sql">true</property>
        
        <!-- 指定自動生成數據表的策略:在運行數據庫的時候hibernate會為我們在數據庫自動生成數據表的策略 -->
        <property name="hbm2ddl.auto">update</property>
        
        <!-- 指定關聯的hbm.xml映射文件 -->
        <mapping resource="com/happybks/hibernate/hibernatePro/beans/CuntomerBean.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

 

 

Step 4.通過Hibernate API 編寫訪問數據庫的代碼

這部分是Hibernate交互操作的基礎。但這基礎隨着Hibernate的版本更迭居然還不停的變化。Hibernate的更新風格真是和Lucene那種前后版本應用代碼不兼容的貨越來越像了。

這里我先按照填坑的腳步,把各個版本的寫法都注釋了:

package com.happybks.hibernate.hibernatePro;

import java.sql.Date;
import java.sql.Timestamp;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;

import com.happybks.hibernate.hibernatePro.beans.CuntomerBean;

public class HibernateTest1 {

	@Test
	public void test1(){
		//1. 創建一個SessionFactory對象
		SessionFactory sessionFactory=null;
		//1.1 創建Configuration對象:對應包含hibernate的基本配置信息(cfg)和對象關系映射信息(hbm)
		Configuration configuration=new Configuration().configure();
		
		//hibernate 3.x版本的SessionFactory的創建方式,4.X被Deprecated,5.x又再次回歸。
		//new Configuration().buildSessionFactory();
		
		//1.2 創建一個ServiceRegistry對象:這個對象是從Hibernate 4.x開始新增加入的
		//hibernate的任務配置和服務需要在該對象中注冊后才能有效。
		//hibernate 4.x版本中的ServiceRegistry創建方式:ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
		//hibernate 5.x版本中的ServiceRegistry創建方式:
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
		
		System.out.println(CuntomerBean.class.getCanonicalName());
		Metadata metadata = new MetadataSources(serviceRegistry).addAnnotatedClass(CuntomerBean.class)
				.addAnnotatedClassName(CuntomerBean.class.getName()).addResource("com/happybks/hibernate/hibernatePro/beans/CuntomerBean.hbm.xml")
				.getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
				.build();

		//1.3 創建sessionFactory
		//hibernate 4.x版本中的sessionFactory創建方式: sessionFactory=configuration.buildSessionFactory(serviceRegistry);
		//hibernate 5.x版本中的sessionFactory創建方式:
		sessionFactory=metadata.getSessionFactoryBuilder().build();
		
		
		//2. 創建一個Session對象
		Session session=sessionFactory.openSession();
		
		//3. 開啟事務
		Transaction transaction=session.beginTransaction();
		
		//4. 執行保存操作。把對象保存到數據庫
		CuntomerBean bean=new CuntomerBean();
		bean.setName("HappyBKs");
		bean.setNo(314);
		bean.setMoney(20688.68);
		bean.setScore(98765432123456789L);
		bean.setRegisterDate(new Date(new java.util.Date().getTime()));
		bean.setLoginTime(Timestamp.valueOf("2017-01-08 12:00:00"));
		session.save(bean);
		
		
		//5. 提交事務。
		transaction.commit();
		
		//6. 關閉Session
		session.close();
		
		//7. 關閉SessionFactory對象。
		sessionFactory.close();
	}
}

這里1.1的configure方法是重載的。可以自己制定配置文件。如

configure()方法包含若干個重載的方法。configure(File )等能夠通過指定配置文件來生成Configure對象。這里我們使用默認的hibernate.cfg.xml。所以只需要使用無參數的configure()方法即可。

 

我們查看configure()的源碼,可以看到無參數的configure()方法就是hibernate.cfg.xml。

這里插個題外話,STS的Maven設置、源代碼和doc自動獲取如下。以后源碼什么的會自動下載到你本地的maven庫。不需要你自己再下載保存整理了。

 

hibernate 3.x版本的SessionFactory的創建方式是new Configuration().buildSessionFactory();,4.X被Deprecated了。(這種方式在5.x又再次回歸,這個最后再說。)

在4版本中,配置被當做服務注冊,並以此建立SessionFactory。

Configuration conf = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(serviceRegistry);

在此種方式下,Hibernate5又進行變動了。ServiceRegistryBuilder直接沒有了,真粗暴!!!!早知道這樣就不要引入這個類啊,你產品經理啊,變來變去。

5版本導入更換為:

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

好吧,我們將就用。

在5版本的Hibernate中,buildServiceReguistry()方法被替換了,用如下方法:

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();

不過創建SessionFactory還需要metadata,而且這個metadata需要將類名、配置文件都需要設置了。

Metadata metadata = new MetadataSources(serviceRegistry).addAnnotatedClass(CuntomerBean.class)
                .addAnnotatedClassName(CuntomerBean.class.getName()).addResource("com/happybks/hibernate/hibernatePro/beans/CuntomerBean.hbm.xml")
                .getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
                .build();

sessionFactory=metadata.getSessionFactoryBuilder().build();

真要這樣寫出這種難以維護的代碼,我寧願用老版本了。

不過這種方式是可以運行的,咱們先看完。

數據庫在運行之前,沒有表。

運行這個測試方法。

日志如下,按照我們在cfg配置文件中設置的,輸出SQL語句,還是格式化的那種。如下:說明運行成功了。一些提示最好要有密碼什么的暫且忽略。

一月 08, 2017 3:22:51 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.5.Final}
一月 08, 2017 3:22:51 下午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
com.happybks.hibernate.hibernatePro.beans.CuntomerBean
一月 08, 2017 3:22:52 下午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
一月 08, 2017 3:22:52 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
一月 08, 2017 3:22:52 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
一月 08, 2017 3:22:52 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/happybksdb?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false]
一月 08, 2017 3:22:52 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
一月 08, 2017 3:22:52 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
一月 08, 2017 3:22:52 下午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
一月 08, 2017 3:22:52 下午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
一月 08, 2017 3:22:53 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@22c01ab0] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Hibernate: 
    
    create table CUNTOMERBEAN (
        CID integer not null auto_increment,
        NAME varchar(255),
        NO integer,
        SCORE bigint,
        MONEY double precision,
        REGISTERDATE date,
        LOGINTIME datetime,
        primary key (CID)
    )
Hibernate: 
    insert 
    into
        CUNTOMERBEAN
        (NAME, NO, SCORE, MONEY, REGISTERDATE, LOGINTIME) 
    values
        (?, ?, ?, ?, ?, ?)
一月 08, 2017 3:22:54 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/happybksdb?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false]

我們查看數據庫,數據表已經為我們自動建立好了。(若干年前還在手寫映射文件和對比數據庫字段有沒有檢錯的我淚流滿面。。)

我們用mysql bench的生成一份建表語句,看看表的定義,與hbm映射文件中的定義字段完全一樣,主鍵也按照設置的native,通過自己的方言,構建了屬於mysql的方式:自增。(oracle和postgresql是建序列)

CREATE TABLE `cuntomerbean` (
  `CID` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) DEFAULT NULL,
  `NO` int(11) DEFAULT NULL,
  `SCORE` bigint(20) DEFAULT NULL,
  `MONEY` double DEFAULT NULL,
  `REGISTERDATE` date DEFAULT NULL,
  `LOGINTIME` datetime DEFAULT NULL,
  PRIMARY KEY (`CID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

查看表的記錄,已經有了:

好吧,回到剛才的問題。這的要用metadata這種方式嗎。我前面已經說了,configuration.buildSessionFactory()方法在hibernate3中被廣泛使用;在4.x中被不推薦;到了5.X又回來了。我們還是用這種方式吧。

package com.happybks.hibernate.hibernatePro;

import java.sql.Date;
import java.sql.Timestamp;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;

import com.happybks.hibernate.hibernatePro.beans.CuntomerBean;

public class HibernateTest1 {

	@Test
	public void test1(){
		//1. 創建一個SessionFactory對象
		SessionFactory sessionFactory=null;
		//1.1 創建Configuration對象:對應包含hibernate的基本配置信息(cfg)和對象關系映射信息(hbm)
		Configuration configuration=new Configuration().configure();
		
		sessionFactory=configuration.buildSessionFactory();
		
		
		//2. 創建一個Session對象
		Session session=sessionFactory.openSession();
		
		//3. 開啟事務
		Transaction transaction=session.beginTransaction();
		
		//4. 執行保存操作。把對象保存到數據庫
		CuntomerBean bean=new CuntomerBean();
		bean.setName("HappyBKs");
		bean.setNo(314);
		bean.setMoney(20688.68);
		bean.setScore(98765432123456789L);
		bean.setRegisterDate(new Date(new java.util.Date().getTime()));
		bean.setLoginTime(Timestamp.valueOf("2017-01-08 12:00:00"));
		session.save(bean);
		
		
		//5. 提交事務。
		transaction.commit();
		
		//6. 關閉Session
		session.close();
		
		//7. 關閉SessionFactory對象。
		sessionFactory.close();
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM