Hibernate 表关系描述之OneToMany

上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;
 而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包含前术类的一个对象,从而实现一对多关系的建立!
 而在Hibernate中采用的是Set类型集合,而使用<one-to-many>主<many-to-one>来实现,好了,我们来看一下:
首先看看表结构!

customer表:

create   table  customers
(
    ID 
bigint   not   null      primary   key  auto_increment,
    userName 
varchar ( 20 )
);

Order表:

create   table  orders
(
    ID 
bigint   not   null   primary   key  auto_increment,
    customers_ID 
bigint ,     -- 应该为customers(ID)外键
    orderDescription  varchar ( 50 ) -- 订单描述
);

有了上面简单的客户表与订单表,来建立一个Project!~并且添加Hibernate~并由上面二张表生成Beans,主键都是native类型~自动递增!
我们将 自动生成的Customer.java    Bean添加一个SET属性,代码如下:

Customers.java
package  fengyan.Hibernate;

import  java.util.HashSet;
import  java.util.Set;

/** */ /**
 *Authod:    fengyan
 *    date:    2006-12-30 01:02    
 
*/


public   class  Customers   implements  java.io.Serializable  {


    
//  Fields    

     
private  Long id;
     
private  String userName;

     
// 必须定义一个Set集合类型的属性以及它的get和set方法,
     
// 它持有一个Customers对象所发出的所有订单的引用
      private  Set orders  =   new  HashSet();

    
//  Constructors

    
public  Set getOrders()  {
        
return  orders;
    }



    
public   void  setOrders(Set orders)  {
        
this .orders  =  orders;
    }



    
/** */ /**  default constructor  */
    
public  Customers()  {
    }


    
    
/** */ /**  full constructor  */
    
public  Customers(String userName)  {
        
this .userName  =  userName;
    }


   
    
//  Property accessors

    
public  Long getId()  {
        
return   this .id;
    }

    
    
public   void  setId(Long id)  {
        
this .id  =  id;
    }


    
public  String getUserName()  {
        
return   this .userName;
    }

    
    
public   void  setUserName(String userName)  {
        
this .userName  =  userName;
    }


}

为Order.java   Bean 去掉cid(CustomerID)并添加一个Customer属性,代码如下:

Orders.java
package  fengyan.Hibernate;
/** */ /**
 *Authod:    fengyan
 *    date:    2006-12-30 01:02    
 
*/


public   class  Orders   implements  java.io.Serializable  {


    
//  Fields    

     
private  Long id;
  
//    private Long customersId;
      private  String orderDescription;

     
// 添加一个Customers属性,用来引用一个订单对象所属的客户对象
      private  Customers customer;
    
//  Constructors

    
public  Customers getCustomer()  {
        
return  customer;
    }



    
public   void  setCustomer(Customers customer)  {
        
this .customer  =  customer;
    }



    
/** */ /**  default constructor  */
    
public  Orders()  {
    }


    
public  Orders(String description)
    
{
        
this .orderDescription  =  description;
    }

   
    
//  Property accessors

    
public  Long getId()  {
        
return   this .id;
    }

    
    
public   void  setId(Long id)  {
        
this .id  =  id;
    }


   
    
public  String getOrderDescription()  {
        
return   this .orderDescription;
    }

    
    
public   void  setOrderDescription(String orderDescription)  {
        
this .orderDescription  =  orderDescription;
    }

}

修改Customer.hbm.xml映射文件:

<? xml version="1.0" encoding="GBK" ?>
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

< hibernate-mapping >
    
< class  name ="fengyan.Hibernate.Customers"  table ="customers"  catalog ="study" >
        
< id  name ="id"  type ="java.lang.Long" >
            
< column  name ="ID"   />
            
< generator  class ="native"   />
        
</ id >
        
< property  name ="userName"  type ="java.lang.String" >
            
< column  name ="userName"  length ="20"   />
        
</ property >
        
        
<!--  name集合属性orders    
             table对应的表名    
             cascade 级联关系,当保存或更新时会级联保存与这个Customers对象相关联的所有Orders对象
             inverse=true是将 控权抛出(给Orders) 
-->
        
< set  name ="orders"  table ="orders"  cascade ="save-update"  inverse ="true" >
            
< key  column ="customers_ID" ></ key > <!--  表字段  -->         
            
< one-to-many  class ="fengyan.Hibernate.Orders" /> <!--  关联的类  -->
        
</ set >
    
</ class >
</ hibernate-mapping >

修改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 ="fengyan.Hibernate.Orders"  table ="orders"  catalog ="study" >
        
< id  name ="id"  type ="java.lang.Long" >
            
< column  name ="ID"   />
            
< generator  class ="native"   />
        
</ id >
       
        
< property  name ="orderDescription"  type ="java.lang.String" >
            
< column  name ="orderDescription"  length ="50"   />
        
</ property >
        
        
<!--  name属性名
             class对应的类
             column对应的表字段 
-->
        
< many-to-one  name ="customer"  class ="fengyan.Hibernate.Customers"  column ="customers_ID" ></ many-to-one >
    
</ class >
</ hibernate-mapping >

然后我们建立一个CustomersDAO操作类

package  fengyan.Hibernate;

import  org.hibernate.Session;
import  org.hibernate.Transaction;

public   class  CustomersDAO  {
    
    
public   void  save(Customers customer)
    
{
        Session session 
=  HibernateSessionFactory.getSession(); // 会话
         try
        
{
            Transaction tx 
=  session.beginTransaction(); // 事物
            session.save(customer); // 保存
            tx.commit(); // 提交事物
        }

        
catch (Exception e)
        
{
            System.out.println(
" DAO has Errors: " + e);
        }

        
finally
        
{
            session.close();
// 关闭会话
        }

    }


}

再来建立一个Servlet     MyServlet.java代码如下:

package  fengyan.Hibernate;

import  java.io.IOException;
import  java.io.PrintWriter;

import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

public   class  MyServlet  c
分享到:
评论

猜你喜欢

转载自zc9861692.iteye.com/blog/1070056
今日推荐