hibenate的一对一,一对多的关联操作实践

69 篇文章 0 订阅

 应用一对一关联实现级联添加数据
 (作业:实现级联删除的功能)
在Record类中建立类型为IdCard的属性和对应的set()/get()方法,其关键代码如下:


    private IdCard idCard;
    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }
  public IdCard getIdCard()
{ return idCard;
}
在Record.hbm.xml文件中映射从Record类到IdCard类的关联,其关键代码如下:
    <one-to-one name="idCard" class="mrgf.IdCard" cascade="all"/>
cascade属性用来设定级联操纵对象的级别,它的可选 值 及使用方法如下表:
可选值   功能
none 默认值,不进行级联操作
save-update 当保存或裂新当前对象时,级联保存或更新关联对象
delete 当删除当前对象时,级联删除关联对象
all 当保存,更新或删除当前对象时,级联保存,更新或删除关联对象

在IdCard类中建立类型为Record的属性和对应的set()/get()方法,其关键代码如下:
   private Record record;
    public void setRecordId(int recordId) {
        this.recordId = recordId;
    }
    public Record getRecord() {
        return record;
    }
}
在IdCard.hbm.xml文件中映射从IdCard类到IdCard类的关联,其关键代码如下:
   <many-to-one name="record" class="mrgf.Record" unique="true" column="record_id"/>
本例采用外键关联,当unique属性值设为true时,表示一对一关联,它的默认值 为false(一对多关联),column属性值为映射表的外键字段名.

Hibernate的add()方法负责对象的持久化,完整代码如下:
package mrgf;

import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.Query;
import java.util.List;
import java.io.*;

public class Hibernate {
    public Hibernate() {
    }

    // 在静态快中加载Hibernate配置信息
    private static SessionFactory sessionFactory;
    static {
        try {
            Configuration config = new Configuration().configure();
            sessionFactory = config.buildSessionFactory();
        } catch (Exception e) {
            System.out.println("------在初始化hibernate时抛出异常,内容如下:");
            e.printStackTrace();
        }
    }

    private Session session = null;
    private Transaction tx = null;

    //添加对象
    public void add(Record record, IdCard idCard) {
        // 打开Session,开启事物
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        // 建立关联,并持久化
        record.setIdCard(idCard);
        idCard.setRecord(record);
        session.save(record);      //在这里只对实例record进行持久化.运行本例,会发现两个实例均被持久化了,这是因为前面将cascade属性值 设

为了all,将其改为none,将不会关联idcard实例.
        // 提交事物,关闭Session
        tx.commit();
        session.close();
    }

    //检索对象
    public List query(String hql) {
        // 打开Session,开启事物
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        // 检索数据
        Query query = session.createQuery(hql);
        List result = query.list();
        // 提交事物,关闭Session
        tx.commit();
        session.close();
        return result;
    }

    //解决表单提交中文乱码
    public String toChinese(String str) {
        String result = null;
        try {
            result = new String(str.trim().getBytes("ISO8859_1"), "GB2312");
        } catch (UnsupportedEncodingException ex) {
        }
        return result;
    }

}

query.jsp 使用
String name=request.getParameter("name");
..//此处省略了部分获得参数的代码
Record r=new Record();
r.setName(name);
..//此处省略了部分获得参数的代码
IdCard id=new IdCard();
id.setType(type);
id.setNumber(number);

Hibernate h=new Hibernate();
h.add(r,id);//调用自定义的方法
检索
 List result=h.query("from Record where name='"+name+"'");
 <td>证件类型:<%=record.getIdCard().getType() %></td>
        <td>证件号码:<%=record.getIdCard().getNumber() %></td>
这也是级联操作起的作用. 在此只是检索了Record类.


应用一对多关联实现级联操作
Merchandise类
    private MerchSort merchSort;
    public void setMerchSort(MerchSort merchSort) {
        this.merchSort = merchSort;
    }
    public MerchSort getMerchSort() {
        return merchSort;
    }
Merchandise.hbm.xml
  <many-to-one name="merchSort" column="merchSort_id" class="mrgf.MerchSort" cascade="all" lazy="false"/>

MerchSord类
 private Set merchandises=new HashSet();
    public Set getMerchandises() {
        return merchandises;
    }

    public void setMerchandises(Set merchandises) {
        this.merchandises = merchandises;
    }

MerchSort.hbm.xml
 <set name="merchandises" cascade="all" lazy="false" inverse="true">
      <key column="merchSort_id"/>
      <one-to-many class="mrgf.Merchandise"/>
    </set>

success.jsp
 Hibernate hibernate = new Hibernate();
MerchSort merchSort=new MerchSort();
      merchSort.setName(ssort);  //1

 Merchandise merchandiseA=new Merchandise(); //对多,A和B
      merchandiseA.setName(merchA);
Merchandise merchandiseB=new Merchandise();
      merchandiseB.setName(merchB);

hibernate.add(merchSort,merchandiseA,merchandiseB);
级联检索数据
  <%
          String hql="from MerchSort";
          List list=hibernate.query(hql);
          Iterator itSort=list.iterator();
          while(itSort.hasNext()){
            MerchSort sort=(MerchSort)itSort.next();
            Set set=sort.getMerchandises();             //通过关联获得Merchandise类的对象集合
            Iterator itMer=set.iterator();
            while(itMer.hasNext()){
              Merchandise mer=(Merchandise)itMer.next();
          %>
          <tr align="center">
            <td><%=mer.getId() %></td>
            <td><%=mer.getName() %></td><!--获得商品名称-->
            <td><%=mer.getMerchSort().getName() %></td><!--获得商品类别-->
            <td><%=mer.getProducingArea() %></td>
            <td><%=mer.getIntroduce() %></td>
          </tr>
          <%
            }
          }
          %>

Hibernate类的add方法
public void add(MerchSort merchSort, Merchandise merchandiseA, Merchandise merchandiseB) {
        merchSort.getMerchandises().add(merchandiseA);//建立实例之间的关联关系
        merchSort.getMerchandises().add(merchandiseB);
        merchandiseA.setMerchSort(merchSort);
        merchandiseB.setMerchSort(merchSort);
        // 打开Session,开启事物
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        // 持久化对象
        session.save(merchSort); //只对merchSort实例化,会发现3个均被持久化了.
        // 提交事物,关闭Session
        tx.commit();
        session.close();

    }


 ------------------------------------------------------------------------------

在数据库中建立了表之间的关系图.
hibernate建实体Bean的时候可自动生成1对多的关系

cascade="all" 级联等级
lazy 延迟,是指检索当前对象时,是否同时检索与当前对象关系的对象。

多对1
<many-to-one name="bbssection" class="my.bean.Bbssection" cascade="all" lazy="false">
            <column name="RSID" not-null="true" />
        </many-to-one>
1对多
private Set bbstopics = new HashSet(0);
public Set getBbstopics() {
  return this.bbstopics;
 }

 public void setBbstopics(Set bbstopics) {
  this.bbstopics = bbstopics;
 }

   <set name="bbstopics" inverse="true" cascade="all" lazy="false">
            <key>
                <column name="TUID" not-null="true" />
            </key>
            <one-to-many class="my.bean.Bbstopic" />
        </set>
设置

少的.get多的().add(多的其中一个);
少的.get多的().add(多的其中另一个);

-------------------------------------------------------------------------------

1对多的添加
 // 添加对象
    public void add(MerchSort merchSort, Merchandise

merchandiseA, Merchandise merchandiseB) {
        merchSort.getMerchandises().add(merchandiseA);
        merchSort.getMerchandises().add(merchandiseB);

//HashSet的add方法。来添加多个对象
        merchandiseA.setMerchSort(merchSort);
        merchandiseB.setMerchSort(merchSort);
        // 打开Session,开启事物
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        // 持久化对象
        session.save(merchSort);
        // 提交事物,关闭Session
        tx.commit();
        session.close();

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值