Hibernate实战(二)

原创 2004年06月22日 18:48:00
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数据库,搞掂。

Hibernate实战(第二版)笔记----第二章--开启一个项目

最近在看Hibernate实战(第二版)这本书,个人感觉翻译的不是很好,有些地方读都读不通。。。 随便做下笔记,书中提供下载源码的地址为: http://jpwh.org  ...
  • u011781521
  • u011781521
  • 2017年07月03日 17:20
  • 705

JAVA高级软件架构师实战培训阶段二

第01节课:整体课程概览 -----------------------以下为分布式架构和部署部分------------------------------------------------...
  • jimei1912
  • jimei1912
  • 2017年03月06日 14:22
  • 1407

maven实战学习(二)--------------maven安装和配置

1.Windows上安装maven 1.1检查JDK安装 Maven可以运行在JDK1.4及以上的版本。打开Windows命令行,运行如下命令来检查安装" 如果没有安装或者没有配置JAVA_...
  • happyAnger6
  • happyAnger6
  • 2015年07月16日 19:49
  • 1248

一本好书(Hibernate实战(第2版))

收到这本书已经好久,甚至读完这本书都已经好久,一直想着写个书评,却一直被这事那事拖着,直到今天。我只想说,这是一本好书。关于Hibernate似乎不必说太多。和朋友聊天,朋友说,你对Hibernate...
  • ronghao100
  • ronghao100
  • 2008年06月22日 16:08
  • 2326

【Hibernate】【一,二,三级缓存】

一级缓存 一级缓存生命周期跟一个session的生命周期相同,最多一个请求 一级缓存就是一个Map对象.作用:便于对对象的管理 用session查询的对象,其实都是一级缓存的数据 原理:用seessi...
  • weixin_40315550
  • weixin_40315550
  • 2018年01月03日 11:21
  • 28

Hibernate实战_笔记10

使用Hibernate EntityManager Hibernate EntityManager是围绕提供JPA编程接口的Hibernate Core的一个包装,支持JPA实体实例的生命周期,并允许...
  • com185272358
  • com185272358
  • 2014年03月08日 13:27
  • 1228

Maven实战(二)--setting.xml详解

maven实战第二篇,setting.xml中的相关配置介绍
  • oDeviloo
  • oDeviloo
  • 2016年07月24日 11:09
  • 2139

Redis实战总结-管道和发布、订阅机制

本篇博客重点介绍Redis的管道,发布/订阅机制。 Redis是一种基于Client-Server模型以及请求/响应协议的TCP服务。Client端发出请求,server端处理并返回结果到客户端。在...
  • guweiyu_thinker
  • guweiyu_thinker
  • 2017年12月13日 21:34
  • 42

python3爬虫(二)实战- 爬糗事百科

python3 爬虫实战
  • youngbit007
  • youngbit007
  • 2017年03月09日 23:00
  • 1491

Asp.Net MVC3 简单教程(二)详解Asp.Net MVC3项目

上一篇文章Asp.Net MVC3 简单教程(一)环境准备中没有详细介绍项目中各个文件夹的作用,以及创建的第一个页面是怎样运行起来的?还有好多的疑问,那在这篇文章中我们将详细介绍项目中各个文件夹的作用...
  • jackljf
  • jackljf
  • 2012年12月05日 00:38
  • 429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate实战(二)
举报原因:
原因补充:

(最多只允许输入30个字)