轉載:http://blog.chinaunix.net/uid-26284395-id-3048988.html
- <?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">
- <!-- Generated by MyEclipse Hibernate Tools. -->
- <hibernate-configuration>
- <session-factory>
- <property name="myeclipse.connection.profile">
- JDBC for MySQL
- </property>
- <property name="connection.url">
- jdbc:mysql://localhost:3306/demo
- </property>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <property name="connection.driver_class">
- org.gjt.mm.mysql.Driver
- </property>
- <property name="dialect">
- org.hibernate.dialect.MySQLDialect
- </property>
- <mapping resource="com/demo/hibernate/beans/User.hbm.xml"
/>
- </session-factory>
- </hibernate-configuration>
使用XML文件進行配置時 指定Java類與數據庫表格的映射文件位置 XML配置文件的位置必須在CLASSPATH的設定中 Web程式的WEB-INF/classes中 我們使用下面的方式讀入XML文件以配置Hibernate
- SessionFactory sf = new Configuration().configure().buildSessionFactory();
Configuration表示Java類與數據庫表格映射的集合 用於之後建立SessionFactory 之後Configuration就不再起作用了 預設的XML文件名稱是hibernate.cfg.xml你也可以指定文件的名稱
壓縮包Hibernate-3.0.zip壓縮包的etc子目錄下提供默認的Hibernate配置文件hibernate.cfg.xml 我們要在HibernateTest中使用XML的配置文件 因此請複製該文件到HibernateTest項目的src目錄下 並添加MySQL的相關配置項 這樣 HibernateTest就支持Hibernate了
3 編寫映射文件 User.hbm.xml
Hibernate映射文件包含了對象/關係映射所需的元數據 元數據包含持久化類的聲明和屬性到數據庫的映射
映射文件是XML格式的文件 它負責持久化類與數據庫表之間的映射 其根目錄是hibernate-mapping 並通過屬性package指定類所在的包 每一個表使用一個class定義 那麼表示類的名稱 table表示關聯的表明 通過property子元素來映射類的變量名與數據庫表字段名之間的映射關係
在這個HibernateTest項目中 我們建立一個映射文件User.hbm.xml來映射到數據表user 映射的類名爲User 所在的包爲com.demo.hibernate.beans
- <?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"
>
- <!-- DO NOT EDIT: This is a generated file that is synchronized -->
- <!-- by MyEclipse Hibernate tool integration. -->
- <!-- Created Tue Aug 14 18:57:22 CST 2007 -->
- <hibernate-mapping package="com.demo.hibernate.beans">
- <class name="User" table="user">
- <id name="id" column="ID" type="integer">
- <generator class="native"/>
- </id>
- <property name="username" column="username" type="string"
/>
- <property name="password" column="password" type="string"
/>
- <property name="email" column="email" type="string"
/>
- </class>
-
- </hibernate-mapping>
4 編寫持久化類User.java
持久化類是指其實例需要被Hibernate持久化到數據庫中的類 持久化通常是與模型中的實體域類 一般都是一張數據表對應一個持久化類 不能認爲所有的持久化類的實例都是持久的狀態 一個實例的狀態也可能是瞬時的或脫管的。
在HibernateTest示例程序中 包含了一個持久化類User.java 該類包含表User的4個字段對應的變量 這些變量都申明爲private類型的
- package com.demo.hibernate.beans;
- public class User
{
- private java.lang.Integer
id;
- private java.lang.String username;
- private java.lang.String password;
- private java.lang.String email;
- public java.lang.String getEmail()
{
- return email;
- }
- public void setEmail(java.lang.String
email) {
- this.email
= email;
- }
- public java.lang.Integer
getId()
{
- return
id;
- }
- public void
setId(java.lang.Integer
id)
{
- this.id
= id;
- }
- public java.lang.String
getPassword()
{
- return password;
- }
- public void
setPassword(java.lang.String
password) {
- this.password
= password;
- }
- public java.lang.String
getUsername()
{
- return username;
- }
- public void
setUsername(java.lang.String
username) {
- this.username
= username;
- }
- }
5 編寫輔助類 HibernateSessionFactory.java
Hibernate的Session 這是一個持久化管理器 通過它從數據庫中存取User
首先我們要從SessionFactory中獲取一個Session
- SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
通過對configure()的調用來轉載hibernate.cfg.xml配置文件 並初始化成一個Configuration實例 在創建SessionFactory之前 可以訪問Configuration來設置其他屬性
SessionFactory應該設置成單例模式 這樣才能在程序中容易地訪問SessionFactory
程序代碼如下
- package com.demo.hibernate.util;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.cfg.Configuration;
- /**
- * Configures and provides access to Hibernate sessions, tied to the
- * current thread of execution. Follows the Thread Local Session
- * pattern, see {@link http://hibernate.org/42.html}.
- */
- public class HibernateSessionFactory
{
- /**
- * Location of hibernate.cfg.xml file.
- * NOTICE: Location should be on the classpath as Hibernate uses
- * #resourceAsStream style lookup for its configuration file. That
- * is place the config file in a Java package - the default location
- * is the default Java package.
- * Examples:
- *
CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
* CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".
- */
- private static
String CONFIG_FILE_LOCATION
= "/hibernate.cfg.xml";
- /** Holds a single instance of Session */
- private static
final ThreadLocal
threadLocal =
new ThreadLocal();
- /** The single instance of hibernate configuration */
- private static
final Configuration cfg
= new
Configuration();
- /** The single instance of hibernate SessionFactory */
- private static
org.hibernate.SessionFactory sessionFactory;
- /**
- * Returns the ThreadLocal Session instance. Lazy initialize
- * the
SessionFactory
if needed. - *
- * @return Session
- * @throws HibernateException
- */
- public static Session currentSession()
throws HibernateException
{
- Session session =
(Session) threadLocal.get();
- if (session
==
null) {
- if
(sessionFactory ==
null)
{
- try
{
- cfg.configure(CONFIG_FILE_LOCATION);
- sessionFactory = cfg.buildSessionFactory();
- }
- catch
(Exception e)
{
- System.err.println("%%%% Error
Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- session = sessionFactory.openSession();
- threadLocal.set(session);
- }
- return session;
- }
- /**
- * Close the single hibernate session instance.
- *
- * @throws HibernateException
- */
- public static
void closeSession()
throws HibernateException
{
- Session session =
(Session) threadLocal.get();
- threadLocal.set(null);
- if (session
!=
null) {
- session.close();
- }
- }
- /**
- * Default constructor.
- */
- private HibernateSessionFactory()
{
- }
- }
這個類不但在他的靜態初始器中使用了SessionFactory 還使用了了一個ThreadLocal變量來保存Session作爲當前工作線程
6 編寫DAO類UserDAO.java
所謂的DAO層 就是數據訪問接口 爲了基於Hibernate的開發中將業務層與數據層分開 DAO層只負責處理調用Hibernate API實現CRUD操作 Service層面向用戶負責調用DAO層的代碼 這樣做的好處是 數據層的代碼不用關心業務服務 可以更好的實現移植
- package com.demo.hibernate.dao;
- import org.hibernate.HibernateException;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import com.demo.hibernate.beans.User;
- import com.demo.hibernate.util.HibernateSessionFactory;
- public class UserDAO
{
- public User getUser(String username)
throws HibernateException
{
- Session session =
null;
- Transaction tx
= null;
- User user =
null;
- try {
- session = HibernateSessionFactory.currentSession();
- tx = session.beginTransaction();
- Query
query = session.createQuery("from User where username=?");
- query.setString(0, username.trim());
- user =
(User)query.uniqueResult();
- query
= null;
- tx.commit
();
- }catch(HibernateException e){
- throw e;
- }finally{
- if
(tx!=null)
{
- tx.rollback();
- }
- HibernateSessionFactory.closeSession();
- }
- return user;
- }
- }
該類實現了一個getUser()函數 根據用戶名username查詢一個用戶對象 在該函數中使用HibernateSessionFactory取得Session對象 然後通過session執行事務 創建查詢對象 返回查詢的用戶對象,操作Session的代碼都是Hibernate提供的API
7 編寫Service類並運行
Service類即服務層 就是面向用戶服務 它定義的方法都是與實際的業務相關的
此例子中 定義一個Service類UserService 他有一個函數valid() 根據用戶名和密碼來判斷用戶是否存在 改函數調用DAO層的UserDAO類來取得一個用戶對象 並比較該對象的密碼與輸入的密碼是否相等 如果相等就返回true 否則返回false 然後編寫一個main()入口函數 用戶調用valid()函數來執行業務的調用 並輸出返回的結果
- package com.demo.hibernate.service;
- import com.demo.hibernate.beans.User;
- import com.demo.hibernate.dao.UserDAO;
- public class UserService
{
-
- public boolean
valid(String username,
String password)
{
- UserDAO test =
new UserDAO();
- User user = test.getUser("admin");
- if(user.getPassword().equals(password))
{
- return true;
- } else
{
- return false;
- }
- }
-
- public static
void main(String[] args)
{
- UserService service =
new UserService();
- boolean
login = service.valid("admin",
"admin");
- System.out.println("驗證結果:"+login);
- }
- }
接下來 運行 UserService.java 運行方式 Java應用程序 即可運行main()函數
此處記住 還要添加日誌屬性文件 三個日誌屬性文件 複製到Hibernate的src子目錄下即可
運行程序 出現錯誤
- Communication failure during handshake. Is there a server running on localhost:3306?
原因:
結果在Mysql.com的官方網站上看到這個解釋,是因爲新的Mysql的認證機制發生了一些變化造成的,解決方法如下
解決方法:
I'd to change the authentication method at the mysql server:
set password for @ = old_password('');
將紅色那部分在cmd-mysql登錄之後敲進去就解決了
假如你的用戶名密碼是root root 那麼紅色部分就是
set password for root@localhost=old_password('root');
最後正確運行的輸出信息
- INFO - Hibernate 3.0.5
- INFO - hibernate.properties not found
- INFO - using CGLIB reflection optimizer
- INFO - using JDK 1.4 java.sql.Timestamp handling
- INFO - configuring from resource: /hibernate.cfg.xml
- INFO - Configuration resource: /hibernate.cfg.xml
- INFO - Mapping resource: com/demo/hibernate/beans/User.hbm.xml
- INFO - Mapping class: com.demo.hibernate.beans.User -> user
- INFO - Configured SessionFactory: null
- INFO - processing extends queue
- INFO - processing collection mappings
- INFO - processing association property references
- INFO - processing foreign key constraints
- INFO - Using Hibernate built-in connection pool (not for production use!)
- INFO - Hibernate connection pool size: 20
- INFO - autocommit mode: false
- INFO - using driver: org.gjt.mm.mysql.Driver at URL: jdbc:mysql://localhost:3306/demo
- INFO - connection properties: {user=root, password=****}
- INFO - RDBMS: MySQL, version: 5.5.17
- INFO - JDBC driver: Mark Matthews' MySQL Driver, version: 2.0.4
- INFO - Using dialect: org.hibernate.dialect.MySQLDialect
- INFO - Using default transaction strategy (direct JDBC transactions)
- INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
- INFO - Automatic flush during beforeCompletion(): disabled
- INFO - Automatic session close at end of transaction: disabled
- INFO - Scrollable result sets: enabled
- INFO - JDBC3 getGeneratedKeys(): disabled
- INFO - Connection release mode: null
- INFO - Maximum outer join fetch depth: 2
- INFO - Default batch fetch size: 1
- INFO - Generate SQL with comments: disabled
- INFO - Order SQL updates by primary key: disabled
- INFO - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
- INFO - Using ASTQueryTranslatorFactory
- INFO - Query language substitutions: {}
- INFO - Second-level cache: enabled
- INFO - Query cache: disabled
- INFO - Cache provider: org.hibernate.cache.EhCacheProvider
- INFO - Optimize cache for minimal puts: disabled
- INFO - Structured second-level cache entries: disabled
- INFO - Statistics: disabled
- INFO - Deleted entity synthetic identifier rollback: disabled
- INFO - Default entity-mode: pojo
- INFO - building session factory
- WARN - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/eeeeeee/HibernateTest/WebRoot/WEB-INF/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
- INFO - Not binding factory to JNDI, no JNDI name configured
- INFO - Checking 0 named queries
- 驗證結果:true