Hibernate3.6应用的示例分析
本篇文章给大家分享的是有关Hibernate3.6应用的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联-专业网站定制、快速模板网站建设、高性价比布尔津网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式布尔津网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖布尔津地区。费用合理售后完善,十载实体公司更值得信赖。
Hibernate是一个非常著名的的对象--关系映射工具,使用的是Hibernate3.6的版本。本文通过建立一个工程,来引导大家学习 hibernate,对hibernate有个认识。有些代码、概念不清楚没关系,后文会慢慢的介绍。
首先建立一个Web Project,然后在WEB-INF/lib下添加相关的jar包。项目结构如下图1所示。jar包介绍如下:
图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:动态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 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; } }
说明如下:这是一种典型的一对多的关联关系。即一个客户会有多个订单,而一个订单必然会属于一个客户,因此对于一个订单来说,如果其客户不存在,则此订单是没有任何意义的。这里设置的是双向的关联关系。因为可能业务中会存在大量的这样的需求:
查询客户的所有订单
根据所给的订单,查询订单所属的客户
类与类之间建立关联关系,可以很方便的从一个对象导航到另外一个对象,建立关系如下:
/** * 订单类 * */ 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所示下:
图2
注意,Id都是自增numeric类型。这里的Orders表的取名问题:因为order 是关键字,作为表名的时候,会报错的,Sql Server 中对关键字作为表名字段名的处理是:使用的时候加上中括号[],有时开发中也没注意到这点,判断错误起来也麻烦,关于这点,参见博客另外一篇文章:因使用关键字做为表名引起的Hibernate报错。
配置文件如下:Customer.hbm.xml
说明如下:
①
②
③
④
name:指定持久化类的属性的名字
type:指定hibernate映射类型,hibernate映射类型是在java类型和Sql类型之间的一个桥梁。比如 java.lang.String 对应 type则为string。详细情况可以参见三者之间的对应关系。如果没有为某个属性设置映射类型,hibernate会利用java的放射机制先识别出持久化类的属性的java的类型,然后自动使用与之对应的hibernate映射类型。
column:指定与持久化类的属性映射的表的字段名,上述代码表示Customer类的name属性对应的是Customer表的Name字段。
not-null:是否允许为空,默认为false。程序中经常碰到为空的异常,此处的配置需特别引起注意!
元素:表示Customer类的orders属性为Set集合, 表示orders里面存放的是一组Order对象, 表示数据库中Orders表通过外键CustomerId参照Customer表。 表示级联保存,默认为none,取值可以有all 、save-update 、delete、delete-orphan ,各参数具体的含义后文有介绍。
Order.hbm.xml
说明:
三、测试代码和测试结果
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()+"订单数目是:"+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 (?)
接下来,我们到数据库中看看记录被插入进来了没有:
图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);
执行的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应用的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。
本文标题:Hibernate3.6应用的示例分析
文章路径:http://scyanting.com/article/ghieod.html