设为首页收藏本站

数码鹭岛论坛

 找回密码
 注-册

QQ登录

只需一步,快速开始

搜索
查看: 3949|回复: 0
打印 上一主题 下一主题

【资料分享】hibernate 快速入門

[复制链接]
跳转到指定楼层
1#
发表于 2003-11-12 15:48:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
hibernate 快速入門
作者 ray_linn  
原文:http://www.jsptw.com/jute/post/view?bid=11&id=3291
  
本文旨在用例子給出大概輪廓(很省時間),具體請參考其自帶的優秀文檔。
  
參考:一群牛人關於jdo和ejb的討論:Java object models debated 其中也提到了此開源專案。
  
1. 一個簡單的例子 --- 我們開發一個Person類:
Person
{
name:String
address:String
id:String
}
  
要通過hibernate實現它要經過以下步驟:
  
主要是先根據物件模型編寫簡單的業務實體類(簡單的bean規範類,即有get,set方法的類,可以用jac等工具生成),再用xml映射文件描述其映射資料庫的方式(很easy),最後就可以通過很少的hibernate api寫測試類對其進行持久化操作。
  
1.1  
寫Person類(Persistent Object),它和普通的類沒甚末不同,但注意它應該複合bean的規範,爲每個屬性提供get,set方法:
package h;
public class Person  
{  
String name
public void setName(String value)
{ this.name=value; }
public String getName()  
{ return name; }  
String address;
public void setAddress(String value)  
{ this.address=value; }
public String getAddress()  
{ return address; }  
String id;
public void setId(String value)
{ this.id=value; }
public String getId()  
{ return id; }
}
  
1.2 填寫物件-關係映射xml文件,不用擔心它的複雜程度,我們可以抄嘛:
和所有o-r 映射工具一樣都要寫這種映射文件。
  
Person.hbm.xml  
建議命名爲:"類名"+"hbm.xml" 並且放置?*** erson類相同包目錄下
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>   
<class name="h.Person">
[$nbsp][$nbsp][$nbsp]<!--hibernate爲我們生成主鍵id-->
[$nbsp][$nbsp][$nbsp][$nbsp]<id name = "id" unsaved-value = "null">
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<generator class="uuid.hex"/>
[$nbsp][$nbsp][$nbsp][$nbsp]</id>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<!--默認把類的變數映射爲相同名字的表列,當然我們可以修改其映射方式-->
[$nbsp][$nbsp][$nbsp][$nbsp]<property name="name"/>
[$nbsp][$nbsp][$nbsp][$nbsp]<property name="address"/>
[$nbsp][$nbsp]</class>
</hibernate-mapping>   
  
1.3 TestPerson 我們?*** ibernate api來進行持久化Person
  
h.TestPerson  
package h;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
class TestPerson{   
private static SessionFactory sessions;
public static void main(String[] args) throws Exception{  
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]//配置環境,分析xml映射文件
[$nbsp][$nbsp]Configuration conf= new Configuration()
[$nbsp][$nbsp][$nbsp][$nbsp].addClass(Person.class);  
//生成並輸出sql到文件(當前目錄)和資料庫
SchemaExport dbExport=new SchemaExport(conf);
dbExport.setOutputFile("build\\sql.txt");  
dbExport.create(true, true);
[$nbsp][$nbsp][$nbsp][$nbsp]sessions = conf.buildSessionFactory();
//以上都是些固定格式的環境配置
//start......  
Session s = sessions.openSession();
[$nbsp][$nbsp][$nbsp][$nbsp]Transaction t = s.beginTransaction();   //1.用普通使用方式建立物件,填充資料
[$nbsp][$nbsp][$nbsp]Person p1=new Person();
[$nbsp][$nbsp][$nbsp]p1.setName("陳鵬");
[$nbsp][$nbsp][$nbsp]p1.setAddress("西安東郊黃陵");
[$nbsp][$nbsp][$nbsp]//2.持久化
[$nbsp][$nbsp][$nbsp]s.save(p1);
[$nbsp][$nbsp][$nbsp][$nbsp]//此時p1已經可以在資料庫中找到
[$nbsp][$nbsp][$nbsp]t.commit();
[$nbsp][$nbsp][$nbsp]s.close();
}}   
  
1.4 爲了運行當然要配置資料庫:我以mysql資料庫爲例子:(只用勞動1次即可)
  
hibernate.properties 在hibernate根源程式的根目錄可以找到此文件模板,copy到我們的類的根目錄。即:“..\h”
  
## MySQL## 前兩行人家都給你填好了,只用填資料庫連接和username,password
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.url jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK
hibernate.connection.username roothibernate.connection.password  
  
1.5 運行TestPerson類,在mysql中觀察create好的表person和其中的資料
ok!整個過程主要的是前3步:寫bean類(Persistent Object),寫o-r映射文件,寫存取測試類。  
  
2. 複雜關係例子
  
我們換一個稍微複雜的例子來看看:
  
表person
id(primary key)  company_id  name  address
000000001  000000002  陳鵬  西安
          
表Company
id(primary key)  name
000000002  東軟
...   
  
兩個表之間通過id相關聯。
  
2.1 Person(已有),Company類:Persistent Object
h.Company
  
package h;
public class Company {
String id;
public void setId(String value) {
this.id=value;
}  
public String getId() {
return id;
}
String name;
public void setName(String value) {
this.name=value;  
}
public String getName() {
return name;  
}  
java.util.List employees=new java.util.Vector();
public void setEmployees(java.util.List value) {
this.employees=value;
}  
public java.util.List getEmployees() {  
return employees;
}
public void addEmployee(h.Person value) {  
employees.add(value);
}
public void removeEmployee(h.Person value) {
employees.remove(value);
}  
public void clearEmployees() {  
employees.clear();
}
} 
  
2.2 填寫物件-關係映射xml文件,Person.hbm.xml照舊
Company.hbm.xml 也放到h.Company類相同目錄下
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
[$nbsp][$nbsp]<class name="h.Company">
[$nbsp][$nbsp][$nbsp]<!--hibernate爲我們生成主鍵id-->
[$nbsp][$nbsp][$nbsp][$nbsp]<id name = "id" unsaved-value = "null">
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<generator class="uuid.hex"/>
[$nbsp][$nbsp][$nbsp][$nbsp]</id>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<property name="name"/>
[$nbsp][$nbsp][$nbsp]<!--1:n關係的映射-->
[$nbsp][$nbsp][$nbsp]<list name="employees" cascade="all">
<key column="company_id"/>
<index column="posn"/>  
<one-to-many class="h.Person"/>
</list>
</class>
</hibernate-mapping>
   
2.3 TestCompany 我們?*** ibernate api來進行持久化Person,Company
  
package h;
import net.sf.hibernate.Session;import net.sf.hibernate.Transaction;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
class TestCompany{
[$nbsp][$nbsp]private static SessionFactory sessions;
public static void main(String[] args) throws Exception{
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]//配置環境,分析xml映射文件
[$nbsp][$nbsp]Configuration conf= new Configuration()
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp].addClass(Person.class)      .addClass(Company.class);
//生成並輸出sql到文件(當前目錄)和資料庫
SchemaExport dbExport=new SchemaExport(conf);
dbExport.setOutputFile("build\\sql.txt");
dbExport.create(true, true);
[$nbsp][$nbsp][$nbsp][$nbsp]sessions = conf.buildSessionFactory();
//以上都是些固定格式的環境配置
//start......
Session s = sessions.openSession();
[$nbsp][$nbsp][$nbsp][$nbsp]Transaction t = s.beginTransaction();
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]//1.用普通方式建立物件,填充資料
[$nbsp][$nbsp][$nbsp]Company c=new Company();
[$nbsp][$nbsp][$nbsp]c.setName("東軟");
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]Person p1=new Person();
[$nbsp][$nbsp][$nbsp]p1.setName("陳鵬");
[$nbsp][$nbsp][$nbsp]p1.setAddress("西安東郊黃陵");   
Person p2=new Person();
[$nbsp][$nbsp][$nbsp]p2.setName("孫昱鵬");
[$nbsp][$nbsp][$nbsp]p2.setAddress("南郊電子城");
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]c.addEmployee(p1);
[$nbsp][$nbsp][$nbsp]c.addEmployee(p2);   
[$nbsp][$nbsp][$nbsp]//2.持久化
[$nbsp][$nbsp][$nbsp]s.save(c);
[$nbsp][$nbsp][$nbsp][$nbsp]//此時c,p1,p2已經可以在資料庫中找到  
[$nbsp][$nbsp][$nbsp]t.commit();
[$nbsp][$nbsp][$nbsp]s.close();  
}}   
2.4 不用再配置資料庫了。
2.5 運行TestCompany類,在mysql中觀察create好的表person和Company其中的資料.
總結:
這個只展現了極爲簡單的2個持久化例子,更多的1:1,1:n,m:n等的物件模型的實現請看hibernate附帶的文檔,越是複雜的模型越能體現其威力。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 注-册

本版积分规则

小黑屋|手机版|Archiver|数码鹭岛 ( 闽ICP备20006246号 )  

counter

GMT+8, 2025-12-3 16:30 , Processed in 0.078019 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表