hibernate學習筆記一

l模型不匹配(阻抗不匹配)

Java面嚮對象語言,對象模型,其主要概念有:繼承、關聯、多態等;

數據庫是關係模型,其主要概念有:表、主鍵、外鍵等。

l解決辦法

1使用JDBC手工轉換。

2使用ORM(Object Relation Mapping對象關係映射)框架來解決,主流的ORM框架有Hibernate、TopLink、OJB。

安裝配置

l下載地址http://www.hibernate.org,本教程使用3.2.5。3.3對緩存做了些處理,其他沒有什麼變化

l將下載目錄/hibernate3.jar和/lib下的hibernate運行時必須的包加入classpath中:

antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar

l配置文件hibernate.cfg.xml和hibernate.properties,XML和properties兩種,這兩個文件的作用一樣,提供一個即可,推薦XML格式,下載目錄/etc下是示例配置文件。

可以在配置文件指定:

數據庫的URL、用戶名、密碼、JDBC驅動類、方言等。

啓動時Hibernate會在CLASSPATH裏找這個配置文件。

l映射文件(hbm.xml,對象模型和關係模型的映射)。在/eg目錄下有完整的hibernate示例。

l快速開始小例子

package myk;

import java.util.Date;

public class User {
	private int id;

	private String name;

	private Date birthday;

	/**
	 * Domain Object限制 1.默認的構造方法(必須的)。 
	 * 2有無意義的標示符id(主鍵)(可選) 
	 * 3非final的,對懶加載有影響(可選),final的無法繼承
	 */

	// hibernate 需要一個缺省的構造函數,你不寫是可以的,編譯器會給你加一個默認的無參構造函數,
	// 如果你寫了一個帶參數的構造函數,hibernate是無法完成映射的,因爲hibernate是通過反射來完成對象的
	// 創建的
	public User() {

	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


package myk;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Base {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Configuration cfg = new Configuration();
		cfg.configure();
		SessionFactory sf = cfg.buildSessionFactory();
		Session s = sf.openSession();
		
		//如果引擎是InnoDB則需要打開實務然後提交
		Transaction tx = s.beginTransaction();
		User user = new User();
		user.setBirthday(new Date());
		user.setName("name");
		s.save(user);
		tx.commit();
		s.close();
		
		
		/**
		 * 
		 * mysql 缺省引擎是ENGINE=MyISAM ,該引擎不支持事務,所以開啓事務和不開啓是一樣的,
		 * 插入之後不能回滾
		mysql> show create table user;
			+-------+---------------------------------------
			------------------------------------------------
			---------------------------------------------+
			| Table | Create Table
			
			                                             |
			+-------+---------------------------------------
			------------------------------------------------
			---------------------------------------------+
			| user  | CREATE TABLE `user` (
			  `id` int(11) NOT NULL auto_increment,
			  `name` varchar(255) default NULL,
			  `birthday` datetime default NULL,
			  PRIMARY KEY  (`id`)
			) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
			+-------+---------------------------------------
			------------------------------------------------
			---------------------------------------------+
			
			mysql支持下面幾種引擎
			mysql> show engines;
+------------+---------+-------------------------------------------------------
--------+
| Engine     | Support | Comment
        |
+------------+---------+-------------------------------------------------------
--------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance
        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tab
es      |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign
eys     |
| BerkeleyDB | NO      | Supports transactions and page-level locking
        |
| BLACKHOLE  | NO      | /dev/null storage engine (anything you write to it dis
ppears) |
| EXAMPLE    | NO      | Example storage engine
        |
| ARCHIVE    | YES     | Archive storage engine
        |
| CSV        | NO      | CSV storage engine
        |
| ndbcluster | NO      | Clustered, fault-tolerant, memory-based tables
        |
| FEDERATED  | NO      | Federated MySQL storage engine
        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables
        |
| ISAM       | NO      | Obsolete storage engine
        |
+------------+---------+-------------------------------------------------------
--------+
12 rows in set (0.00 sec)
			
		*/
	}
}

<?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 package="myk">
	<!-- 如果不寫table缺省和類名是相同的 -->
	<class name="User" table="user">
		<id name="id">
			<!-- native其實是一個類名的簡寫 -->
			<generator class="native" />
		</id>
		<property name="name"/>
		<property name="birthday" />
	</class>
</hibernate-mapping>

<!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="hibernate.connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<!-- 如果連接的是本機而且缺省端口是3306就可以用///來代替 -->
	<property name="connection.url">jdbc:mysql:///test</property>
	<property name="connection.username">root</property>
	<property name="connection.password"></property>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<!--
		它包含4個屬性:
		create:會根據你的model類來生成表,但是每次運行都會刪除上一次的表,重新生成表,哪怕2次沒有任何改變 
		create-drop : 根據model類生成表,但是sessionFactory一關閉,表就自動刪除 
		update : 最常用的屬性,也根據model類生成表,即使表結構改變了,表中的行仍然存在,不會刪除以前的行 
		validate : 只會和數據庫中的表進行比較,不會創建新表,但是會插入新值
	-->
	<property name="hbm2ddl.auto">create</property>
	<property name="show_sql">true</property>
	<mapping resource="myk/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章