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

news/2024/7/4 1:26:01 标签: hibernate, session, string, class, iterator, list
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 应用一对一关联实现级联添加数据
 (作业:实现级联删除的功能)
在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.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.Configuration;
import org.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.SessionFactory;
import org.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.Session;
import org.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.Transaction;
import org.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.Query;
import java.util.List;
import java.io.*;

public class Hibernate {
    public Hibernate() {
    }

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

    private Session class="tags" href="/tags/SESSION.html" title=session>session = null;
    private Transaction tx = null;

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

为了all,将其改为none,将不会关联idcard实例.
        // 提交事物,关闭Session
        tx.commit();
        class="tags" href="/tags/SESSION.html" title=session>session.close();
    }

    //检索对象
    public List query(String hql) {
        // 打开Session,开启事物
        class="tags" href="/tags/SESSION.html" title=session>session = class="tags" href="/tags/SESSION.html" title=session>sessionFactory.openSession();
        tx = class="tags" href="/tags/SESSION.html" title=session>session.beginTransaction();
        // 检索数据
        Query query = class="tags" href="/tags/SESSION.html" title=session>session.createQuery(hql);
        List result = query.list();
        // 提交事物,关闭Session
        tx.commit();
        class="tags" href="/tags/SESSION.html" title=session>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 class="tags" href="/tags/HIBERNATE.html" title=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);

class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.add(merchSort,merchandiseA,merchandiseB);
级联检索数据
  <%
          String hql="from MerchSort";
          List list=class="tags" href="/tags/HIBERNATE.html" title=hibernate>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,开启事物
        class="tags" href="/tags/SESSION.html" title=session>session = class="tags" href="/tags/SESSION.html" title=session>sessionFactory.openSession();
        tx = class="tags" href="/tags/SESSION.html" title=session>session.beginTransaction();
        // 持久化对象
        class="tags" href="/tags/SESSION.html" title=session>session.save(merchSort); //只对merchSort实例化,会发现3个均被持久化了.
        // 提交事物,关闭Session
        tx.commit();
        class="tags" href="/tags/SESSION.html" title=session>session.close();

    }


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

在数据库中建立了表之间的关系图.
class="tags" href="/tags/HIBERNATE.html" title=hibernate>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,开启事物
        class="tags" href="/tags/SESSION.html" title=session>session = class="tags" href="/tags/SESSION.html" title=session>sessionFactory.openSession();
        tx = class="tags" href="/tags/SESSION.html" title=session>session.beginTransaction();
        // 持久化对象
        class="tags" href="/tags/SESSION.html" title=session>session.save(merchSort);
        // 提交事物,关闭Session
        tx.commit();
        class="tags" href="/tags/SESSION.html" title=session>session.close();

    }

 


http://www.niftyadmin.cn/n/1425710.html

相关文章

struts设计模式之DispathAction类实现多个操作

struts设计模式DispathAction类实现用户查询通常在一个Action类中只完成一个业务操作,如果在一个Action类中要完成一组紧密 相关的业务操作,可以使用DispathAction类.DispathAction类继承Action类,它是一个 抽象类,封装了一些基本的方兴未艾,来赋予一个Action类处理多个操作的…

《Spring 2.0核心技术与最佳实践》第一天

序java开发,从桌面系统到企业应用,从手机到智能卡. 随着J2EE1.5标准的发布,Sun将J2EE正式更名为JaveEE,JavaEE平台继承了Java语言的安全性和高可移植性,为企业应用的设计,开发,部署和管理提供了一套完善的解决方案,它包括了从前端Web界面到中间件,再到后端数据库系统的一系列技…

《Spring 2.0核心技术与最佳实践》第二天

组件就是普通的Bean(拿来重复使用) 使用IoC容器管理Bean1.函数重用,类重用,组件重用(通过接口来使用?)2 控制权(负责创建配置组件)发生了反转,从应用程序转移到了IoC容器.在IoC容器中能被"装配",需有"注入"机制,使组件注到另一组件.依赖注入:将组件配置和…

《Spring 2.0核心技术与最佳实践》第三天

第三天 1.Ioc_XDoclet学习,XDoclet使用 (三个配置文件,一个Bean中要写的标注,xDoclet的jar包) 配置Ant(连接spring的模板,还可以合并手写的spring-bean.xml)来实现xml的自动生成(bin/config.xml) Ant的build.xml (关键配置文件)<?xml version"1.0" encoding&…

菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记

系列索引&#xff1a;菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊&#xff0c;回老家过年断更的几天之后&#xff0c;我会因为无聊在除夕这天做了会儿题&#xff0c;然后写篇题解。 文章目录【题目】【我的代码】【进制转换笔记】【思考】【题目】 题目链…

《Spring 2.0核心技术与最佳实践》第四天

hsqldb文档(把数据以文件的形式保存下来的方法?)HSQLDB是一个纯Java编写的数据库.使用方法1.导入hsqldb.jar org.hsqldb.jdbcDriver jdbc:hsqldb:mem:bookstore2. 编程 (org.hsqldb.Server;)import java.sql.Connection;import java.sql.DriverManager;import java.s…

菜菜的深度学习笔记 | 基于Python的理论与实现(九)—>Affine层的实现

系列索引&#xff1a;菜菜的深度学习笔记 | 基于Python的理论与实现 文章目录&#xff08;一&#xff09;Affine层&#xff08;二&#xff09;Softmax层&#xff08;三&#xff09;误差反向传播法的实现1.神经网络的全貌2.手撕两层网络&#xff08;一&#xff09;Affine层 神经…

【图解AES加密算法】AES算法的Python实现 | Rijndael-128 | 对称加密 | 物联网安全

系列索引&#xff1a;【图解安全加密算法】加密算法系列索引 Python保姆级实现教程 | 物联网安全 | 信息安全 完整代码已更新 文章目录一、AES的前世今生二、AES简介三、初始变换Initial round四、字节代换SubBytes五、行移位ShiftRows六、列混合MixColumns七、轮秘钥加AddRoun…