hello hibernate

一、hellohibernate3在eclipse中的項目數如下:

圖中的所有jar文件來自hibernate3下載包。

我是先把他們拷貝到本項目lib文件夾下,

再在eclipse中把他們加載進項目Project->Properties->Java build path->Libraries -> "Add External JARs"

二、各文件源代碼:

Event.hbm.xml:://///////////////////////////////////////////////////////////////

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

<hibernate-mapping>

    <class name="events.Event" table="EVENTS">
        <id name="id" column="EVENT_ID">
            <generator class="native"/>
        </id>
        <property name="date" type="timestamp" column="EVENT_DATE"/>
        <property name="title"/>
    </class>

</hibernate-mapping>

Event.java://///////////////////////////////////////////////////////////////

package events;

import java.util.Date;

public class Event {
    private Long id;

    private String title;
    private Date date;

    public Event() {}

    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

EventManager.java://///////////////////////////////////////////////////////////////

package events;
import org.hibernate.Session;

import java.util.Date;

import util.HibernateUtil;

public class EventManager {

    public static void main(String[] args) {
        EventManager mgr = new EventManager();

        //if (args[0].equals("store")) {
            mgr.createAndStoreEvent("My Event", new Date());
        //}

        HibernateUtil.getSessionFactory().close();
    }

    private void createAndStoreEvent(String title, Date theDate) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Event theEvent = new Event();
        theEvent.setTitle(title);
        theEvent.setDate(theDate);

        session.save(theEvent);

        session.getTransaction().commit();
    }

}

HibernateUtil.java://///////////////////////////////////////////////////////////////

package util;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="connection.url">jdbc:mysql://192.168.171.32/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <mapping resource="events/Event.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

 

 

 

 

 

 

 

 

終於有點對hibernate入門的感覺。方便門外的學習者,給一個簡單的入門例子。
如果你有用過其他持久架構 轉到hibernate其實很簡單。一些原理方面就不講了,
robbin講的肯定比我好的多,自己去精華版看看。
我所給的只是我當初剛開始接觸hibernate時候很想要的一個簡單例子和設置方法。
一直沒有找到,所以現在放到這裏給大家看看,(只給想要入門的一個直觀的感應,呵呵)

首先當然要新建一個項目

然後在Project Properties->Paths->Required Libraries->add->new 這裏定義hibernate的類庫 把hibernate的lib下面的所有jar包進去 當然還有hibernate2.jar也要
然後一路ok下去就可以了。

再來就是hibernate.properties
從hibernate的src下面找到
把它拷到你項目的src目錄下
(什麼,你的項目沒有src目錄,新建一個隨便的類就有src目錄了)

這樣一個JB下面的hibernate的開發環境就好了

然後在hibernate.properties裏面設置你的數據庫連接
默認是HypersonicSQL

嗯 接下來的是你最想要做的事情了 其實很簡單
新建一個類Message.java
代碼如下

代碼:
package hello;

import java.io.Serializable;

/**
* @author getdown
* @version 1.0
*/

public class Message implements Serializable {
private Long id;
private String text;
//定義一個簡單鏈表 指向另外的一個Message
private Message nextMessage;
public Message() {}

public Message(Long id) {
this.id = id;
}

public Message(String text) {
this.text = text;
}

public Message(Long id, String text) {
this.id = id;
this.text = text;
}

public Long getId() {
return id;
}

private void setId(Long id) {
this.id = id;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public Message getNextMessage() {
return nextMessage;
}

public void setNextMessage(Message nextMessage) {
this.nextMessage = nextMessage;
}

}

接下來是這個類對應的hibernate的配置文件 Message.hbm.xml

代碼:
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<!--定義類和表的對應-->
<class
name="hello.Message"
table="Messages"
>
<!--定義ID字段和生成ID的策略 這裏採用identity-->
<id name="id"
column="MESSAGE_ID"
>
<generator class="identity"/>
</id>
<!--定義裏面的text字段-->
<property
name="text"
type="string">
<!--定義text字段在數據庫裏面生成的方法-->
<column
name="TEXT"
length="100"
not-null="true"
/>
</property>
<!--定義對象關聯之間的對應關係和關聯的字段-->
<many-to-one
name="nextMessage"
cascade="all"
column="NEXT_MESSAGE_ID"
/>
</class>
</hibernate-mapping>

然後就是測試類

代碼:
package hello;

import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
import net.sf.hibernate.Session;
import net.sf.hibernate.Query;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.type.LongType;
import net.sf.hibernate.Transaction;



/**
* @author getdown
* @version 1.0
*/

public class Hello {
public Hello() {
}

public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration().addClass(Message.class);

/** 顧名思義 構建表。。。第一次運行的時候運行下面語句可以在數據庫生成表
* 之後可以把下面這句去掉
* */
// new SchemaExport(cfg).create(true, true);

//先生成sessionFactory
SessionFactory sessions = cfg.buildSessionFactory();
//再從sessionFactory得到一個session
Session session = sessions.openSession();
//開始對數據庫的操作



/*----對數據庫的創建操作--------*/
Message message = new Message("helloWorld");
//創建一條記錄
session.save(message);
//存入記錄
session.flush();


/*---對數據庫的查詢操作---------------*/
// Message message = new Message();
// Query q = session.createQuery("from Message as message where message.id=1");
// message = (Message) q.list().get(0);
// message.getNextMessage().setText("helloNext");
// session.flush();
// session.close();
// Long id = new Long(1);
// Message message = (Message) session.find("from Message as message where message.id=?", id, Hibernate.LONG).get(0);
// System.out.println(message.getText());


// /*-------事務的處理----------------*/
// Transaction tx = session.beginTransaction();
// try {
// Message message = new Message("hello");
// session.save(message);
// session.flush();
// message = new Message("hello");
// session.save(message);
// session.flush();
// tx.commit();
// }
// catch (HibernateException ex) {
// tx.rollback();
// }

/*-------添加1000條記錄時間--------------*/
// Message message;
// long start = System.currentTimeMillis();
// for(int i = 0; i < 1000; i ++) {
// message = new Message("hello");
// session.save(message);
// session.flush();
// }
// long end = System.currentTimeMillis();
// System.out.println("添加1000條記錄時間---" + (end-start)/1000 + "s");



session.close();


}

}

ok了 運行一下Hello看看出來什麼吧
怎麼樣 比起CMP的持久 hibernate的持久是不是顯得很輕量級。。
還可以試試看hibernate的性能 把Hello.java的最後一段註釋去掉運行看看

當然hibernate最重要的還是它的原理,還有很多很好的,很有趣的功能和O/RM設計思想等着你自己發掘。
多看看它自己的文檔,可以學到很多東西,它的文檔真的非常好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章