数码鹭岛论坛
标题:
【资料分享】hibernate 快速入門
[打印本页]
作者:
翔子
时间:
2003-11-12 15:48
标题:
【资料分享】hibernate 快速入門
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附帶的文檔,越是複雜的模型越能體現其威力。
欢迎光临 数码鹭岛论坛 (http://www.clore.net/forum/)
Powered by Discuz! X3.2