Hibernate实战(二)

Hibernate实战(二)
 Bromon原创 版权所有
 one-to-one关系
 在绝大多数系统当中不可能只存在一个数据表格,否则就违背了关系数据库的初衷。表与表的关系比较复杂,可以分为几种情况:

 ● 一对一关联(one to one)
 ● 一对多关联(one to many)
 ● 多对一关联(many to one)
 ● 多对多关联(many to many)

 按顺序来讲。假设一个一对一关联的例子是:
 表格:person
 id 编号(主键)
 name 姓名
 email email地址

 表格:spouse
 id 编号(外键)
 name 姓名

 person这个表保存用户信息,而spouse保存用户配偶的信息。在一般情况下一个人只有一个配偶,这很适合我们一对一的情况。如果你对婚外恋感兴趣的话,我们可以在一对多和多对一的关联中讨论这个问题,也许还可以在多对多中^_^(禽兽!)。

 OK,下面设计POJO:
 Person这个类非常简单:

 /*
 * Created on 2004-4-19
 */
 package org.bromon.zizz;

 /**
 * @author Bromon
 */
 public class Person
 {
 private int id;
 private String name;
 private String email;

 public void setId(int id)
 {
  this.id=id;
 }
 public int getId()
 {
  return(id);
 }

 public void setName(String name)
 {
  this.name=name;
 }
 public String getName()
 {
  return(name);
 }

 public void setEmail(String email)
 {
  this.email=email;
 }
 public String getEmail()
 {
  return(email);
 }
 } 


 然后编写它的映射规则,这个应该能够理解了:
 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 "' target=_blank>http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  

 <hibernate-mapping package="org.bromon.zizz">
 <class name="Person" table="person" lazy="true">
 <id name="id" type="integer" unsaved-value="null">
 <column name="id" sql-type="int" not-null="true"/>
 <generator class="identity"/>
 </id>

 <property name="name" column="name" not-null="true" unique="false"/>
 <property name="email" column="email" not-null="false"/>
 </class> 
 </hibernate-mapping> 

 so easy是不是?一切都按部就班。下面是Souse类:

 /*
 * Created on 2004-4-20
 */
 package org.bromon.zizz;

 /**
 * @author Bromon
 */
 public class Spouse
 {
 private int id;
 private String name;
 private Person person;

 public void setId(int id)
 {
  this.id=id;
 }
 public int getId()
 {
  return(id);
 }

 public void setName(String name)
 {
  this.name=name;
 }
 public String getName()
 {
  return(name);
 }

 public void setPerson(Person person)
 {
  this.person=person;
 }
 public Person getPerson()
 {
  return(person);
 }
 } 


 注意里面的域person。它的映射文件:

 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 "' target=_blank>http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  

 <hibernate-mapping package="org.bromon.zizz">
 <class name="Spouse" table="spouse" lazy="true">
 <id name="id" type="integer" unsaved-value="null">
 <column name="id" sql-type="int" not-null="true"/>
 <generator class="foreign"> 
 <param name="property">person</param> 
 </generator> 
 </id>

 <property name="name" column="name" not-null="true" unique="false"/>
 <one-to-one name="person" class="Person" cascade="all" constrained="true" />
 </class> 
 </hibernate-mapping> 

 这里指明了id的generator是一个外键,和person相关联。然后指定一个one-to-one关系,不难理解是不是?Hibernate的确很符合我们的思维习惯。需要提醒的是,这种关联关系是单向的,Person并不需要去指定Spouse。

 下面来操作这两个类:

 /*
 * Created on 2004-4-20
 */
 package org.bromon.zizz;
 import net.sf.hibernate.*;
 import net.sf.hibernate.cfg.*;
 import net.sf.hibernate.tool.hbm2ddl.*;
 /**
 * @author Bromon
 */
 public class OperateSpouse
 {
 public static void main(String args[])
 {
  try
  {
   Configuration cfg=new Configuration().addClass(Spouse.class);
   cfg.addClass(Person.class);
   SessionFactory factory=cfg.buildSessionFactory();
   new SchemaExport(cfg).create(true,true);
   Session session=factory.openSession();
  
   Person person=new Person();
   person.setName("bromon");
   person.setEmail("bromon@163.com");
  
   Spouse spouse=new Spouse();
   spouse.setName("who");
   spouse.setPerson(person);
   
   Transaction ts=session.beginTransaction();
   session.save(person);
   session.save(spouse);
   ts.commit();
   session.close();
  }catch(Exception e)
  {
   System.out.println(e);
  }
 } 
 } 


 这个例子和第一篇中的例子非常相似。OK,执行一下,然后看看zizz数据库,搞掂。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值