`
wrf44wrf
  • 浏览: 14944 次
社区版块
存档分类
最新评论

一对一关联关系的使用-开心就好-iteye技术网站

 
阅读更多

一对一关联关系的使用-开心就好-iteye技术网站
2011年09月01日
      一对一关系在实际生活中是比较常见的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。 
  1.以主键关联 
  主键关联的重点是,关联的两个实体共享一个主键值。例如,Student与Card是一对一关系,它们在数据库中对应的表分别是t_student 和t_card。它们共用一个主键值id,这个主键可由t_student表或t_card表生成。问题是如何让另一张表引用已经生成的主键值呢?例如,t-student表填入了主键id的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制。 
  为了表示Student与Card之间的一对一关联关系,在Student和Card的映射文件Student.hbm.xml和Card.hbm.xml中都要使用标记,如例程9-2所示。 
  例程9-2  Student.hbm.xml 
  -------------------------------------------------- ------------------ 
  --------------------------- 
   
   
   
   
   
   
   
   
    
   
   
   
   
   
  元素的lazy属性设定为true,表示延迟加载,如果lazy的值设置为false,则表示立即加载。下面对立即加载和延迟加载这两个概念进行说明。 
  立即加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1)。 
  延迟加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,不会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1),而是等到需要时,才会从数据库取得数据,组装此关联对象。 
  元素的cascade属性表明操作是否从父对象级联到被关联的对象,它的取值如下。 
  none:在保存、删除或修改对象时,不对其附属对象(关联对象)进行级联操作。这是默认设置。 
  save-update:在保存、更新当前对象时,级联保存、更新附属对象(临时对象、游离对象)。 
  delete:在删除当前对象时,级联删除附属对象。 
  all:在所有情况下均进行级联操作,即包含save-update和delete操作。 
  delete-orphan:删除和当前对象解除关系的附属对象。 
  元素的fetch属性的可选值是join和select,默认值是select。当fetch属性设定为 join时,表示连接抓取(Join fetching): Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。 当fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。 
  例程9-3中元素的cascade属性设置为“all”,表示增加、删除及修改Student对象时,都会级联增加、删除和修改Card对象。 
  例程9-3  Card.hbm.xml 
  -------------------------------------------------- --------------------------------------------- 
   
   
   
   
   
   
  student 
   
   
   
   
   
   
   
  在例程9-3中,Card.hbm.xml的主键id使用外键(foreign)生成机制,引用代号为“student”对象的主键作为Card表的主键和外键。student在该映射文件的元素中进行了定义,它是Student对象的代号。元素的属性Constrained="true"表示Card引用了student的主键作为外键。 
  需要特别注意的是,Student类中要相应地加入一对get/set方法: 
  public Card getCard() { 
  return this.card;    
  } 
  public void setCard(Card card) { 
  this.card = card; 
  } 
  在Card类中也要相应地加入一对get/set方法: 
  public Student getStudent() { 
  return this.stu; 
  } 
  public void setStudent(Student stu) { 
  this.stu = stu; 
  } 
  在客户端测试程序中操纵Student和Card对象的方法如例程9-4所示。 
  例程9-4  客户端测试程序 
  package test; 
  import org.hibernate.*; 
  import org.hibernate.cfg.*; 
  import java.io.File; 
  import java.util.List; 
  public class Test { 
  public static void main(String[] args) { 
  File file = new File("D:\\eclipse3.2\\workspace\\HibernateTest 
  \\hibernate.cfg.xml"); 
  Configuration  conf = new Configuration().configure(file); 
  SessionFactory  sf = conf.buildSessionFactory(); 
  Session session = sf.openSession(); 
  Transaction tx = session.beginTransaction(); 
  //新建Student对象 
  Student stu = new Student(); 
  stu.setName("Walker"); 
  stu.setSex("male"); 
  stu.setAge(22); 
  //新建Card对象 
  Card card = new Card(); 
  card.setName("Walker"); 
  //设置Student对象与Card对象之间的关联 
  stu.setCard(card); 
  card.setStudent(stu); //此句不能省略,否则card将不知从何处取得主键值 
  try { 
  session.save(stu); 
  tx.commit(); 
  session.close(); 
  System.out.println("Data have been inserted into DB."); 
  } catch (HibernateException e) { 
  e.printStackTrace(); 
  tx.rollback(); 
  session.close(); 
  }    
  } 
  } 
  运行以上代码后,将会在t_student表和t_card表中插入相应的数据。 
  2.以外键关联 
  以外键关联的要点是:两个实体各自有不同的主键,但其中一个实体有一个外键引用另一个实体的主键。例如,假如Student和Card是外键关联的一对一关系,它们在数据库中相应的表分别是t_student表和t_card表,t_student表有一个主键id,t_card表有一个主键id和一个外键stu_id,此外键对应student表的主键id。 
  Student的映射文件Student.hmb.xml见例程9-2。但Card的映射文件Card.hbm.xml要做相应变动,如例程9-5所示。 
  例程9-5  Card.hbm.xml 
  -------------------------------------------------- --------------------------------------- 
  ----------------------------- 
  <?xml version="1.0"?> 
  <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
  "http://hibernate.sourceforge.net/hibernate-mappin g-2.0.dtd"> 
  <hibernate-mapping> 
  <class name="test.Card"  table="T_CARD" lazy= "true"> 
  <id name="id" > 
  <generator class="increment" > 
   
  </id> 
  <property name="name" column="NAME" type="string" /> 
    
  </class> 
  </hibernate-mapping> 
  在例程9-5中,元素的name属性声明外键关联对象的代号,class属性声明该外键关联对象的类,column属性声明该外键在数据表中对应的字段名,unique属性表示使用DDL为外键字段生成一个唯一约束。 
  以外键关联对象的一对一关系,其实本质上变成了一对多的双向关联了,应直接按照一对多和多对一的要求编写它们的映射文件。当元素的unique属性设定为true,多对一的关系实际上变成了一对一的关系。 
  在客户端程序中操纵外键关联一对一关系的对象的方法见例程9-4。 
  
  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics