基于MyEclipse的Hibernate的多对一和一对多操作简单示例

 

     Hibernate的一对多和多对一操作真的很方便,如果系统采用Hibernate作为持久层,完全可以把对应的一对多和多对一逻辑关系放在Hibernate里面控制,减少数据库的负担,而且也更清晰。

  1、多对一和一对多概念

   其实这个概念上来说很简单,比如一个客户可以有多个订单,多个订单属于同一个客户。就是最基本的一对多,和多对一。数据库使用中,感觉多对一和一对多算是比较常见的逻辑关系了。

 我曾经做过一些数据库,比如某些政府部门的,其表单很设计的很简单粗糙,甚至连主键都没有,完全靠在事务层补全这些关系。其实通过Hibernate持久层来实现逻辑关系也是很不错的方法。

 下面的例子,就是数据库逻辑上基本没有定义,主要放在持久层里面。这个也主要是我对数据库操作属于半通水的原因。

2、数据库层

这里面有两个表单,一个CUSTOMER,客户表单,一个是ORDERS,订单表单。

生成客户表单,这个是在SQL Server里面做的,其实其他都一样,因为逻辑关系在Hibernate上面,id是主键非空,其他可以为空,

CREATE TABLE [dbo].[CUSTOMER](
 [id] [numeric](18, 0) NOT NULL,
 [name] [varchar](50) NULL,
 [age] [int] NULL,
 CONSTRAINT [PK_CUSTOMER] PRIMARY KEY  )

订单表单

 id为主键非空,CUSTOMER_id是对应客户主键,也非空,这里不做外键设置。

CREATE TABLE [dbo].[ORDERS](
 [id] [numeric](18, 0)  NULL PRIMARY KEY,
 [CUSTOMER_id] [numeric](18, 0) NOT NULL,
 [ORDER_NUMBER] [varchar](50) NULL,
 [PRICE] [numeric](18, 3) NULL
)
3、Hibernate设定

HIbernate里面,一对多的对象体现,是客户有一个集合set,set里面放着对应订单

而多对一体现,是订单里面有一个CUSTOMER对象,表明该订单所属的客户。

其中,CUSTOMER类为

public class Customer implements java.io.Serializable {

 private Long id;
 private String name;
 private Integer age;
 private Set rderses = new HashSet();


后面的getXXX和setXXX方法就省去了

同样订单类就是

public class Orders implements java.io.Serializable {

 private Long id;
 private Customer customer;
 private String orderNumber;
 private Double price;

而对应hbm文档,就是map文档如下

CUSTOMER.hbm.xml

BR>"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
--&gt

   
       
           
           
       
       
           
       
       
           
       
       
           
               
           
           
       
   

这个里面,其他都很简答了,其中表示主键值自动增加,这个主要针对字符串对应的,主要体现多对以的是

       
           
               
           
           
       
其中,set表示,对应集合;fetch 和 lazy 主要是用来级联查询的,   而 cascade 和 inverse 主要是用来级联插入和修改的。

这几个主要包括对集合的控制,具体可以参考

http://www.cnblogs.com/tongzhiyong/archive/2009/05/06/1451021.html

表示对应类,即set里面包含的类,

而key主要是用于确定set里面对应表单列。

ORDERS的hbm

<?xml version="1.0" encoding="utf-8"?>
BR>                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
--&gt

 
 
  
  
 
 
  
 
 
  
 
 
  
 
 

这里面, 


  
 

表示CUSTOMER熟悉对应的类,和其作为key 的列名

上面这些都可以在MyEclipse里面自动生成。

另外注意的一点是,在生成的DAO里面

涉及表单操作的save()和delete()方法,必须要事件提交,数据库才有反映。

可以就该Hibernate.xml,或者用下面这样代码来实现。

Session se=getSession();
   Transaction tx=se.beginTransaction();
  
   se.delete(persistentInstance);

//se.save(instance);
   tx.commit();

4、验证效果

1、新增用户,

如果新增一个用户,该用户里面包含有两个表单,那么,由于持久层已经实现了逻辑关系,只要用户类里面的set包含了表单,则表单可以自动增加。

实现代码

   CustomerDAO cd=new CustomerDAO();
   
   Customer xd=new Customer("王小虎",20, null);
  
   Orders ord1=new Orders();
   
   ord1.setCustomer(xd);
   ord1.setOrderNumber("王小虎的买单1");
   Orders ord2=new Orders();
   ord2.setCustomer(xd);
   ord2.setOrderNumber("王小虎的买单2");
   
   Set rderses = new HashSet();
   orderses.add(ord1);
   orderses.add(ord2);
   
   xd.setOrderses(orderses);
   cd.save(xd);

代码里面,加入一个王小虎用户。两个订单,通过setOrderses加入,只使用cd.save这一个对持久层操作。

完成后查询

王小虎
=================================
王小虎的买单1
王小虎的买单2

显示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的订单。

2、删除操作

 List csList=cd.findByProperty("name","王小虎");
   for(Customer cs:csList){
   cd.delete(cs);
   }

这个很简单了,通过其中findByProperty("name","王小虎");
对应SQL为delete from table CUSTOMER where name=''王小虎';

删除了王小虎,而ORDERS里面,王小虎对应的表单也同时被删除。

 

 

5、小小总结

Hibernate的多对一和一对多处理,还是挺方便的,如果在减少数据库复杂度的原则来说,把一些逻辑处理放在持久层是一个常见的方法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-631423/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22259926/viewspace-631423/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值