Hibernate实战(三)

原创 2004年06月22日 18:49:00
Many-to-One关系
 Bromon原创 请尊重版权
 很明显一对多或者多对一关系是关系数据库中非常常见的现象,下面通过父亲-儿子的例子来演示一对多关系,多对一关系是类似的,不过在我们的这个例子中不宜采用,否则会带来伦理学上的问题。

 首先定义Child类:
 /*
  * Created on 2004-5-8
  */
 package org.bromon.zizz;

 /**
  * @author Bromon
  */
 public class Child
 {
  private int id;
  private String name;
  private int fatherId;
  private Person father;

  public Child(){}
  
  /**
   * @return
   */
  public Person getFather()
  {
   return father;
  }

  /**
   * @return
   */
  public int getFatherId()
  {
   return fatherId;
  }

  /**
   * @return
   */
  public int getId()
  {
   return id;
  }

  /**
   * @return
   */
  public String getName()
  {
   return name;
  }

  /**
   * @param person
   */
  public void setFather(Person p)
  {
   father = p;
  }

  /**
   * @param i
   */
  public void setFatherId(int i)
  {
   fatherId = i;
  }

  /**
   * @param i
   */
  public void setId(int i)
  {
   id = i;
  }

  /**
   * @param string
   */
  public void setName(String string)
  {
   name = string;
  }

 }

 这里的fatherId是外键,关联person表的id字段。

 下面是映射文件Child.hbm.xml:
 <?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="Child" table="child" 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"/>
   <many-to-one name="father" column="fatherid" />
       
  </class> 
 </hibernate-mapping>
 需要注意的是fatherId并没有做为一个property被映射,而是在many-to-one声明中使用。

 需要对Person..java做修改,添加以下代码:

 import java.util.*;

 private Set children=new HashSet();
 /**
 * @return
 */
 public Set getChildren()
 {
  return children;
 }
 /**
 * @param set
 */
 public void setChildren(Set set)
 {
  children = set;
 }

 然后修改Person.hbm.xml,对添加的代码做映射:

 <set name="books" lazy="true" inverse="true" cascade="all" > 
  <key column="fatherid"/> 
  <one-to-many class="Child" /> 
 </set>

 这里的key column是child表的外键,inverse需要指定为true。

 下面做操作一下,功能是查询person表中id=1的记录,作为小孩的父亲,然后给child表添加一条新记录。

 /*
  * Created on 2004-5-8
  */
 package org.bromon.zizz;
 import net.sf.hibernate.*;
 import net.sf.hibernate.cfg.*;
 import net.sf.hibernate.tool.hbm2ddl.*;
 /**
  * @author Bromon
  */
 public class OperateChild
 {
  /**
   * @param args
   */
  public static void main(String args[])
  {
   try
   {
    Configuration cfg = new Configuration().addClass(Person.class);
    cfg.addClass(Child.class);
    SessionFactory sessions = cfg.buildSessionFactory();
    new SchemaExport(cfg).create(true, true);
    Session session = sessions.openSession();
    
    Child c=new Child();
    
    /*Query q=session.createQuery("from org.bromon.zizz.Person as p where p.id=1");
    Person p=(Person)q.list().get(0);*/
    
    Person p=(Person)session.find("from org.bromon.zizz.Person as p where p.id=?",new Integer(1),Hibernate.INTEGER).get(0);
    System.out.println(p.getName());
    c.setName("andy");
    c.setFather(p);
    
    Transaction ts = session.beginTransaction();
    session.save(c);
    ts.commit();
    session.close();
   } catch (Exception e)
   {
    System.out.println(e);
   }
  }
 }

 被注释掉的部分是HQL的另外一种查询方法。在这个例子中可以看出对象的查询非常容易,不需要自己再去封装数据,修改和删除对象也很容易:

 //得到一个对象
 Query q=session.createQuery("from org.bromon.zizz.Person as p where p.id=1");
 Person p=(Person)q.list().get(0);

 //修改数据
 p.setName(“Mr Smith”);

 //保存数据
 session.save(p);
 session.flush();

 //删除数据
 session.delete(p);
 session.flush();

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

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

Hibernate之模拟三表问题之多对多manytomany之映射为3表注解版-与(十七)xml版本对应(二十三)

1 package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persis...
  • jintianhen1
  • jintianhen1
  • 2013年12月30日 13:41
  • 951

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

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

Hibernate中三表联结的HQL语句写法

+--------------+-------------+------+-----+---------+----------------+ | Field        | Type       ...
  • zhaoxd_1
  • zhaoxd_1
  • 2014年06月19日 14:19
  • 1525

hibernate多表关联的简单写法

1.这是普通的mysql 三表关联的果询语句 select p.* from category c,categorysecond cs,product p where c.cid = cs.cid a...
  • q1054261752
  • q1054261752
  • 2016年07月08日 08:27
  • 433

Hibernate实战_笔记10

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

《struts2实战》读后感

为什么读 早在两年前,我就已经在使用struts2开发项目了,为什么现在还要回过头来再看一遍这本书呢? 所谓温故而知新,但我看这本书时的感觉已经不是温故了,从书中我又发现了我以前从来没有在意,甚至从...
  • xjyaitf
  • xjyaitf
  • 2014年02月11日 16:48
  • 1592

Hibernate实战(一)

Hibernate实战  bromon原创 请尊重版权    对象关系映射(Object Relative Mapping)简称ORM,是面向对象开发的一个热点,用来解决JDBC开发中手动进行OR映...
  • bromon
  • bromon
  • 2004年06月22日 18:47
  • 2740

Hibernate4实战之注解版

Hibernate4实战之Hibernate4注解零配置 @Entity,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) 。 @Table,注册在类...
  • he90227
  • he90227
  • 2014年08月27日 10:22
  • 1157

翻译 - Hibernate入门指南

Hibernate入门指南翻译,水平有限多多包涵
  • big_xue
  • big_xue
  • 2017年03月17日 16:01
  • 301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate实战(三)
举报原因:
原因补充:

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