溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate3.6應用的示例分析

發(fā)布時間:2021-10-29 10:31:20 來源:億速云 閱讀:121 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關Hibernate3.6應用的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Hibernate是一個非常著名的的對象--關系映射工具,使用的是Hibernate3.6的版本。本文通過建立一個工程,來引導大家學習 hibernate,對hibernate有個認識。有些代碼、概念不清楚沒關系,后文會慢慢的介紹。

首先建立一個Web Project,然后在WEB-INF/lib下添加相關的jar包。項目結構如下圖1所示。jar包介紹如下:

Hibernate3.6應用的示例分析

圖1

hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\lib\required 目錄下相應的jar包:

  • antlr-2.7.6.jar:HQL-->SQL的轉換

  • commons-collections-3.1.jar:Apache的集合類工具

  • dom4j.jar:解析XML文檔

  • hibernate3.jar:hibernate核心API實現

  • javassist-3.12.0.GA.jar:動態(tài)Java代碼生成工具

  • jta-1.1.jar:標準的Java事務處理接口

  • 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 Set<Order> orders = new HashSet<Order>();           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<Order> getOrders() {            return orders;        }           public void setOrders(Set<Order> 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;        }       }

說明如下:這是一種典型的一對多的關聯關系。即一個客戶會有多個訂單,而一個訂單必然會屬于一個客戶,因此對于一個訂單來說,如果其客戶不存在,則此訂單是沒有任何意義的。這里設置的是雙向的關聯關系。因為可能業(yè)務中會存在大量的這樣的需求:

  • 查詢客戶的所有訂單

  • 根據所給的訂單,查詢訂單所屬的客戶

類與類之間建立關聯關系,可以很方便的從一個對象導航到另外一個對象,建立關系如下:

/**     * 訂單類     * */   public class Order {        private Long id;        private Customer customer;             //...    }

這樣就從order對象導航到了customer對象,從order對象到customer對象的導航如下:即給定了order對象,獲得了與他所關聯的costomer對象。

Customer customer = order.getCustomer();

那么對于給定的costomer對象,如何從customer對象導航到order對象呢?因為customer對象里面包含一組order,即一個客戶會存在多個訂單。

因此對于給定的客戶,要查詢所有的訂單,代碼如下:

返回的是一個Set集合。

customer.getOrders();//返回一個set集合,用迭代器訪問。

關于集合類的操作,也不是本文的內容,讀者可以參考其他文章。不清楚的,可以本文后面留言。

二、數據庫和配置文件

建立的數據庫如圖2所示下:

Hibernate3.6應用的示例分析

圖2

注意,Id都是自增numeric類型。這里的Orders表的取名問題:因為order 是關鍵字,作為表名的時候,會報錯的,Sql Server 中對關鍵字作為表名字段名的處理是:使用的時候加上中括號[],有時開發(fā)中也沒注意到這點,判斷錯誤起來也麻煩,關于這點,參見博客另外一篇文章:因使用關鍵字做為表名引起的Hibernate報錯。

配置文件如下:Customer.hbm.xml

<?xml version="1.0" encoding="utf-8"?>   <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">      <hibernate-mapping>       <class name="com.yaxing.entity.Customer" table="Customer">           <id name="id" type="java.lang.Long" column="Id">                               <generator class="identity"></generator>           </id>           <property name="name" column="Name" type="string"></property>           <set name="orders" cascade="all" inverse="true">               <key column="CustomerId"/><!-- 對應著外鍵 -->               <one-to-many class="com.yaxing.entity.Order"/>           </set>       </class>   </hibernate-mapping>

說明如下:

①<class>元素指定類和表的映射,如果沒有指定table屬性,則hibernate將類名做為表名。一個<class>包括一個<id>子元素和多個<property>子元素。

②<id>元素設定持久化類的OID(Object Identifier)和表的主鍵的映射,上述配置代碼表示Customer類的id屬性和Customer表的Id字段對應。

③<id>元素的<generator>子元素用于指定對象標識符生成器,它負責為OID生成唯一標識符。后文將介紹常見的對象標識符生成器的介紹。本文使用的是 native表示hibernate根據底層數據庫來選擇。

④<property>子元素設定類的屬性和表的字段的映射,常見的屬性包括

  • name:指定持久化類的屬性的名字

  • type:指定hibernate映射類型,hibernate映射類型是在java類型和Sql類型之間的一個橋梁。比如 java.lang.String 對應 type則為string。詳細情況可以參見三者之間的對應關系。如果沒有為某個屬性設置映射類型,hibernate會利用java的放射機制先識別出持久化類的屬性的java的類型,然后自動使用與之對應的hibernate映射類型。

  • column:指定與持久化類的屬性映射的表的字段名,上述代碼表示Customer類的name屬性對應的是Customer表的Name字段。

  • not-null:是否允許為空,默認為false。程序中經常碰到為空的異常,此處的配置需特別引起注意!

  • <set>元素:表示Customer類的orders屬性為Set集合,<one-to-many>表示orders里面存放的是一組Order對象,<key>表示數據庫中Orders表通過外鍵CustomerId參照Customer表。<cascade>表示級聯保存,默認為none,取值可以有all 、save-update 、delete、delete-orphan ,各參數具體的含義后文有介紹。

Order.hbm.xml

<?xml version="1.0" encoding="utf-8"?>   <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">      <hibernate-mapping>       <class name="com.yaxing.entity.Order" table="Orders">           <id name="id" type="java.lang.Long" column="Id">               <generator class="identity"></generator>           </id>           <property name="orderNumber" column="OrderNumber" type="string"></property>           <many-to-one name="customer" column="CustomerId"               class="com.yaxing.entity.Customer" cascade="all" lazy="false"               not-null="true"></many-to-one>       </class>   </hibernate-mapping>

說明:<many-to-one>表示 建立了customer屬性和Orders表的外鍵CustomerId之間的映射,name為持久化類的屬性的名字,column為持久化類的屬性對應的表的外鍵CustomerId,class為持久化類的屬性的類型,not-null表示是否允許為空,默認值為false.lazy是hibernate的檢索策略,后文將有介紹。

三、測試代碼和測試結果

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 List<Customer> listCustomer;           public Customer getCustomer() {            return customer;        }           public void setCustomer(Customer customer) {            this.customer = customer;        }           public List<Customer> getListCustomer() {            return listCustomer;        }           public void setListCustomer(List<Customer> 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<Customer> 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 List<Order> listorder;           public Order getorder() {            return order;        }           public void setorder(Order order) {            this.order = order;        }           public List<Order> getListorder() {            return listorder;        }           public void setListorder(List<Order> 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<Order> 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()+"訂單數目是:"+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();        }       }

測試代碼如下:

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();            /**             * 添加對象             * */           ca.addCustomer(customer);    }

允許之后,打印出來的SQL語句如下:

Hibernate:         insert         into           Customer            (Name)         values           (?)

接下來,我們到數據庫中看看記錄被插入進來了沒有:

Hibernate3.6應用的示例分析

圖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

接下來,我們刪除剛測試的ID為8的記錄,

/**             * 刪除指定對象             * */           Customer customer = ca.findCustomer(8L);            ca.deleteCustomer(customer);

運行的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的記錄刪除了!

最后來個級聯保存的:

/**             * 保存訂單             * 級聯保存             * */           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=?

可以查看下記錄:

Hibernate3.6應用的示例分析

最后帖上hibernate的配置代碼:

<?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>           <property name="dialect">               org.hibernate.dialect.SQLServerDialect            </property>           <property name="connection.url">               jdbc:jtds:sqlserver://server:1434/hibernateTest            </property>           <property name="connection.username">sa</property>           <property name="connection.password">711</property>           <property name="connection.driver_class">               net.sourceforge.jtds.jdbc.Driver            </property>           <property name="hibernate.show_sql">true</property>           <property name="format_sql">true</property>           <property name="myeclipse.connection.profile">jtds</property>           <mapping resource="com/yaxing/entity/Order.hbm.xml" />           <mapping resource="com/yaxing/entity/Customer.hbm.xml" />       </session-factory>      </hibernate-configuration>

以上就是Hibernate3.6應用的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI