本篇文章給大家分享的是有關(guān)Hibernate3.6應(yīng)用的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比布爾津網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式布爾津網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋布爾津地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
Hibernate是一個(gè)非常著名的的對(duì)象--關(guān)系映射工具,使用的是Hibernate3.6的版本。本文通過建立一個(gè)工程,來引導(dǎo)大家學(xué)習(xí) hibernate,對(duì)hibernate有個(gè)認(rèn)識(shí)。有些代碼、概念不清楚沒關(guān)系,后文會(huì)慢慢的介紹。
首先建立一個(gè)Web Project,然后在WEB-INF/lib下添加相關(guān)的jar包。項(xiàng)目結(jié)構(gòu)如下圖1所示。jar包介紹如下:
圖1
hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\lib\required 目錄下相應(yīng)的jar包:
antlr-2.7.6.jar:HQL-->SQL的轉(zhuǎn)換
commons-collections-3.1.jar:Apache的集合類工具
dom4j.jar:解析XML文檔
hibernate3.jar:hibernate核心API實(shí)現(xiàn)
javassist-3.12.0.GA.jar:動(dòng)態(tài)Java代碼生成工具
jta-1.1.jar:標(biāo)準(zhǔn)的Java事務(wù)處理接口
slf4j-api-1.6.1.jar:日志管理API
slf4j-nop-1.6.1.jar:日志管理。
一、持久化類如下:
Customer.java
package com.yaxing.entity; import java.util.HashSet; import java.util.Set; /** * 顧客類 * */ public class Customer { private Long id; private String name; private Setorders = new HashSet (); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getOrders() { return orders; } public void setOrders(Set orders) { this.orders = orders; } }
Order.java
package com.yaxing.entity; /** * 訂單類 * */ public class Order { private Long id; private Customer customer; private String orderNumber; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public String getOrderNumber() { return orderNumber; } public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } }
說明如下:這是一種典型的一對(duì)多的關(guān)聯(lián)關(guān)系。即一個(gè)客戶會(huì)有多個(gè)訂單,而一個(gè)訂單必然會(huì)屬于一個(gè)客戶,因此對(duì)于一個(gè)訂單來說,如果其客戶不存在,則此訂單是沒有任何意義的。這里設(shè)置的是雙向的關(guān)聯(lián)關(guān)系。因?yàn)榭赡軜I(yè)務(wù)中會(huì)存在大量的這樣的需求:
查詢客戶的所有訂單
根據(jù)所給的訂單,查詢訂單所屬的客戶
類與類之間建立關(guān)聯(lián)關(guān)系,可以很方便的從一個(gè)對(duì)象導(dǎo)航到另外一個(gè)對(duì)象,建立關(guān)系如下:
/** * 訂單類 * */ public class Order { private Long id; private Customer customer; //... }
這樣就從order對(duì)象導(dǎo)航到了customer對(duì)象,從order對(duì)象到customer對(duì)象的導(dǎo)航如下:即給定了order對(duì)象,獲得了與他所關(guān)聯(lián)的costomer對(duì)象。
Customer customer = order.getCustomer();
那么對(duì)于給定的costomer對(duì)象,如何從customer對(duì)象導(dǎo)航到order對(duì)象呢?因?yàn)閏ustomer對(duì)象里面包含一組order,即一個(gè)客戶會(huì)存在多個(gè)訂單。
因此對(duì)于給定的客戶,要查詢所有的訂單,代碼如下:
返回的是一個(gè)Set集合。
customer.getOrders();//返回一個(gè)set集合,用迭代器訪問。
關(guān)于集合類的操作,也不是本文的內(nèi)容,讀者可以參考其他文章。不清楚的,可以本文后面留言。
二、數(shù)據(jù)庫和配置文件
建立的數(shù)據(jù)庫如圖2所示下:
圖2
注意,Id都是自增numeric類型。這里的Orders表的取名問題:因?yàn)閛rder 是關(guān)鍵字,作為表名的時(shí)候,會(huì)報(bào)錯(cuò)的,Sql Server 中對(duì)關(guān)鍵字作為表名字段名的處理是:使用的時(shí)候加上中括號(hào)[],有時(shí)開發(fā)中也沒注意到這點(diǎn),判斷錯(cuò)誤起來也麻煩,關(guān)于這點(diǎn),參見博客另外一篇文章:因使用關(guān)鍵字做為表名引起的Hibernate報(bào)錯(cuò)。
配置文件如下:Customer.hbm.xml
說明如下:
①
②
③
④
name:指定持久化類的屬性的名字
type:指定hibernate映射類型,hibernate映射類型是在java類型和Sql類型之間的一個(gè)橋梁。比如 java.lang.String 對(duì)應(yīng) type則為string。詳細(xì)情況可以參見三者之間的對(duì)應(yīng)關(guān)系。如果沒有為某個(gè)屬性設(shè)置映射類型,hibernate會(huì)利用java的放射機(jī)制先識(shí)別出持久化類的屬性的java的類型,然后自動(dòng)使用與之對(duì)應(yīng)的hibernate映射類型。
column:指定與持久化類的屬性映射的表的字段名,上述代碼表示Customer類的name屬性對(duì)應(yīng)的是Customer表的Name字段。
not-null:是否允許為空,默認(rèn)為false。程序中經(jīng)常碰到為空的異常,此處的配置需特別引起注意!
Order.hbm.xml
說明:
三、測(cè)試代碼和測(cè)試結(jié)果
CustomerAction.java
package com.yaxing.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.yaxing.entity.Customer; import com.yaxing.util.HibernateUtil; public class CustomerAction { private Customer customer; private ListlistCustomer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public List getListCustomer() { return listCustomer; } public void setListCustomer(List listCustomer) { this.listCustomer = listCustomer; } /** * 添加客戶 * */ public void addCustomer(Customer customer) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(customer); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } /** * 刪除客戶 * */ public void deleteCustomer(Customer customer) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.delete(customer); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } /** * 更新客戶 * */ public void update(Customer customer,String name) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); customer.setName(name); s.update(customer); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } /** * 查詢客戶 * */ public Customer findCustomer(Long id) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); customer = (Customer) s.get(Customer.class, id); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } return customer; } /** * 查找所有的客戶 * */ public List findAll() { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); Query query = s.createQuery("from Customer as a order by id asc"); listCustomer = query.list(); for(Iterator iter=listCustomer.iterator();iter.hasNext();){ Customer customer = (Customer) iter.next(); System.out.println("客戶ID是:"+customer.getId()+"客戶姓名是:"+customer.getName()); } tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } return listCustomer; } }
OrderAction.java的代碼和Customer.java代碼類似。
package com.yaxing.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.yaxing.entity.Order; import com.yaxing.util.HibernateUtil; public class OrderAction { private Order order; private Listlistorder; public Order getorder() { return order; } public void setorder(Order order) { this.order = order; } public List getListorder() { return listorder; } public void setListorder(List listorder) { this.listorder = listorder; } public void addorder(Order order) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(order); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } /** * 刪除用戶 * */ public void deleteorder(Order order) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.delete(order); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } public void update(Order order,String number) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); order.setOrderNumber(number); s.update(order); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } } public Order findorder(Long id) { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); order = (Order) s.get(Order.class, id); tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } return order; } public List findAll() { Session s = null; Transaction tx = null; try { s = HibernateUtil.getSession(); tx = s.beginTransaction(); Query query = s.createQuery("from Order as a order by id asc"); listorder = query.list(); for(Iterator iter=listorder.iterator();iter.hasNext();){ Order order = (Order) iter.next(); System.out.println("訂單ID是:"+order.getId()+"訂單數(shù)目是:"+order.getOrderNumber()); } tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ if(s!=null){ s.close(); } } return listorder; } }
HibernateUtil.java如下:
package com.yaxing.hibernate.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public final class HibernateUtil { private static SessionFactory sessionFactory; private HibernateUtil(){ } static { Configuration cfg = new Configuration(); cfg.configure(); sessionFactory=cfg.buildSessionFactory(); } public static SessionFactory getSessionFactory() { return sessionFactory; } public static Session getSession(){ return sessionFactory.openSession(); } }
測(cè)試代碼如下:
package com.yaxing.test; import com.yaxing.entity.Customer; public class Test { public static void main(String args[]){ Customer customer = new Customer(); customer.setName("51CTO"); CustomerAction ca = new CustomerAction(); /** * 添加對(duì)象 * */ ca.addCustomer(customer); }
允許之后,打印出來的SQL語句如下:
Hibernate: insert into Customer (Name) values (?)
接下來,我們到數(shù)據(jù)庫中看看記錄被插入進(jìn)來了沒有:
圖3
可以看到,如圖3所示,記錄插入成功!
接下來我們看看查詢所有的:
/** * 查詢所有 * */ ca.findAll();
輸出:
Hibernate: select customer0_.Id as Id1_, customer0_.Name as Name1_ from Customer customer0_ order by customer0_.Id asc 客戶ID是:2客戶姓名是:null 客戶ID是:4客戶姓名是:51CTO 客戶ID是:5客戶姓名是:51CTO 客戶ID是:6客戶姓名是:51CTO 客戶ID是:7客戶姓名是:51CTO 客戶ID是:8客戶姓名是:51CTO
接下來,我們刪除剛測(cè)試的ID為8的記錄,
/** * 刪除指定對(duì)象 * */ Customer customer = ca.findCustomer(8L); ca.deleteCustomer(customer);
運(yùn)行的SQL語句如下:
Hibernate: select customer0_.Id as Id1_0_, customer0_.Name as Name1_0_ from Customer customer0_ where customer0_.Id=? Hibernate: select orders0_.CustomerId as CustomerId1_1_, orders0_.Id as Id1_, orders0_.Id as Id0_0_, orders0_.OrderNumber as OrderNum2_0_0_, orders0_.CustomerId as CustomerId0_0_ from Orders orders0_ where orders0_.CustomerId=? Hibernate: delete from Customer where Id=?
可以查看下,Id為8的記錄刪除了!
最后來個(gè)級(jí)聯(lián)保存的:
/** * 保存訂單 * 級(jí)聯(lián)保存 * */ Customer customer = new Customer(); customer.setName("google"); ca.addCustomer(customer); Order order = new Order(); order.setOrderNumber("5箱"); order.setCustomer(customer); oa.addorder(order);
執(zhí)行的SQL語句如下:
Hibernate: insert into Customer (Name) values (?) Hibernate: insert into Orders (OrderNumber, CustomerId) values (?, ?) Hibernate: update Customer set Name=? where Id=?
可以查看下記錄:
最后帖上hibernate的配置代碼:
org.hibernate.dialect.SQLServerDialect jdbc:jtds:sqlserver://server:1434/hibernateTest sa 711 net.sourceforge.jtds.jdbc.Driver true true jtds
以上就是Hibernate3.6應(yīng)用的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。