`
zc9861692
  • 浏览: 5993 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate 表关系描述之OneToOne

阅读更多
在数据库领域中,数据表和数据表之间关系一般可以分为如下几种:
单对单:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人!
单对多:比如单个客户和订单之间的关系,每个客户可以同时下多张订单!
多对多:比如学生管理系统中,学生与课程,教师与学生之间的关系!
上面是简单的说了下数据库表与表之间的关系,那么我们现在要说的是Hibernate,来看看Hibernate中如何使用表与表的关系,首先来看看我数据库中二个示例表user和card分别表示用户和身份证!二个表中分别有二字段,创建表的DDL如下:
create table `study`.`card`(
        `cardid` int default '' not null,--主键
       `cardnum` int,    --身份证号
        primary key (`cardid`)
    );
    create unique index `PRIMARY` on `study`.`card`(`cardid`);

        create table `study`.`user`(
        `userid` int not null auto_increment,--主键,自动递增
       `username` varchar(20),--用户名
        primary key (`userid`)
    );
    create unique index `PRIMARY` on `study`.`user`(`userid`);

这二张表简单说明人与身份证的关系,熟练点的朋友可能看到我们并没有在card类中为cardid指明外键,而它的外键应该就是user表中的 userID,那么这些关系在哪儿声明呢,讲到Hibernate,当然就是在Hibernate中定义了,好了,开始看看如何做:
首先还是建立一个Project,加载Hibernate,并且由MYSQL,生成映射Bean,具体做方法参见Hibernate 初识(补充)
,我们看生成的Card和User类很普通,与先前我们讲到的没什么区别,但现在我们要在这二个Bean中添加属性,Card添加user属性,而User添加card属性,完整代码如下:
User.java
package fengyan.hibernate;



public class User  implements java.io.Serializable {


    // Fields   

     private Integer userid;
     private String username;

     private Card card;
    

    // Constructors

    public Card getCard() {
        return card;
    }


    public void setCard(Card card) {
        this.card = card;
    }


    /** *//** default constructor */
    public User() {
    }

   
    /** *//** full constructor */
    public User(String username) {
        this.username = username;
    }

  
    // Property accessors

    public Integer getUserid() {
        return this.userid;
    }
   
    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return this.username;
    }
   
    public void setUsername(String username) {
        this.username = username;
    }
}

Card.java
package fengyan.hibernate;



public class Card  implements java.io.Serializable {


    // Fields   

     private Integer cardid;
     private Integer cardnum;
     private User user;
    

    // Constructors

    public User getUser() {
        return user;
    }


    public void setUser(User user) {
        this.user = user;
    }


    /** *//** default constructor */
    public Card() {
    }

   
    /** *//** full constructor */
    public Card(Integer cardnum) {
        this.cardnum = cardnum;
    }

  
    // Property accessors

    public Integer getCardid() {
        return this.cardid;
    }
   
    public void setCardid(Integer cardid) {
        this.cardid = cardid;
    }

    public Integer getCardnum() {
        return this.cardnum;
    }
   
    public void setCardnum(Integer cardnum) {
        this.cardnum = cardnum;
    }
}

我们现在就可以看到这样用户中有卡,卡也对应用户,一对一!在Bean中体现,当然现在我们已经要有概念,就是仅仅在Bean中这样声明是没用的,我们需要修改类与表的映射文件
先改User.hbm.xml:内容如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="fengyan.hibernate.User" table="user">
        <id name="userid" type="java.lang.Integer">
            <column name="userid" />
            <generator class="native" /><!-- 主键为自动递增 -->
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="20" />
        </property>
       
        <!--
            我们添加一个<ont-to-one>节点
            里面的属性card    对应的calss         
            cascade="all"一个用户对应一张卡,一张卡对应一个用户,但还是有一个主的,也就是人
            我们先出生人,然后才办卡,所以在这加入cascade由User主控                                                           
        -->     
        <one-to-one name="card" class="fengyan.hibernate.Card" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

补充说明,cascade=all,说明当User删除或增加时Card也受影响!
Card.hbm.xml 内容如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="fengyan.hibernate.Card" table="card">
        <id name="cardid" type="java.lang.Integer">
            <column name="cardid" />
            <generator class="foreign"><!-- User是递增,那么卡的编号从哪来? -->
                <param name="property">user</param><!--外键为user这个属性来确定-->
            </generator>
        </id>
        <property name="cardnum" type="java.lang.Integer">
            <column name="cardnum" />
        </property>
       
        <one-to-one name="user" class="fengyan.hibernate.User"></one-to-one>
    </class>
</hibernate-mapping>

配置完成后,我们来一编写一个DAO类userDAO.java代码如下:
package fengyan.hibernate;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class UserDAO {

    public void save(User user)
    {
       
        Session session = HibernateSessionFactory.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(user);
        transaction.commit();
        session.close();
    }
}

新建一个Servlet处理代码如下:
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        User user = new User();
        user.setUsername("fengyan");//设置用户名
        Card card = new Card();
        card.setCardnum(420983);//设置身份证号
        user.setCard(card);
        card.setUser(user);
        UserDAO ua = new UserDAO();
        ua.save(user);//这样在添加用户的时候会自动添加一张卡
    }

最后JSP代码:
  <body>
    This is my JSP page. <br>
    <a href="servlet/addUser">add user</a>
  </body>

当我们运行的时候,会发现User表中新增了一条记录

同时Card表中也新增了一条记录,但我们在doPost()方法中仅仅是save(user),而并没有save(card),为什么card也会添加进去,这就是我们在配置文件中写的表关系作用!
分享到:
评论

相关推荐

    hibernate_onetoone实例

    在这个“Hibernate一对一实例”中,我们将深入探讨如何使用Hibernate来实现对象与数据库表之间的一对一关系映射。 【描述】:“里面是Hibernate一对一的例子,里面有数据库,是用Oracle连接的,把脚本生成一下就...

    Hibernate映射关系配置:XML方式和注解方式

    4. **关系映射**:注解如`@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany`等,它们在实体类的属性上声明,描述实体间的关联关系。 **标签解析** "源码"和"工具"这两个标签暗示了讨论可能涉及实际代码示例...

    用Hibernate映射继承关系

    除了继承关系,描述中还提到了Hibernate的关联映射,这是另一个核心概念: - **一对一(One-to-One)映射**:一个实体与另一个实体有唯一的关系,例如一个人只有一个身份证。可以使用`@OneToOne`注解实现,可以是...

    hibernate E-R模型关系配置

    在Java开发领域,Hibernate是一个非常流行的Object-Relational Mapping(ORM)框架,它允许开发者将Java对象映射到关系数据库的表中,从而简化了数据库操作。本话题将深入探讨如何利用Hibernate配置E-R(实体-关系)...

    Hibernate ORM - 一对多双向连接表关联关系

    “Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...

    Hibernate教程04_关系映射之一对一单向外键关联

    **标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...

    Hibernate ORM - 一对一连接表关联关系

    标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...

    hibernate annotation hibernate3

    Hibernate 3中的注解机制使得开发者能够更直观地在Java类中描述数据库模型,减少了XML配置文件的使用,提升了开发效率。通过熟练掌握这些注解,开发者可以更好地运用Hibernate进行数据持久化操作,实现高效、灵活的...

    Hibernate关系映射

    Hibernate关系映射是Java开发中一种重要的对象关系映射(ORM)技术,它允许开发者用面向对象的方式处理数据库操作,极大地提高了开发效率。本篇将深入探讨Hibernate关系映射的核心概念、配置和常见实践,以帮助你更...

    struts2+hibernate+spring多表操作示例

    通过以上描述,我们可以看到Struts2、Hibernate和Spring在多表操作中的协同工作,使得开发者可以更加专注于业务逻辑,而不是底层的数据库操作。理解并熟练掌握这三大框架的集成,对于Java Web开发人员来说至关重要。

    hibernate关系映射

    以下是关于“Hibernate关系映射”的详细解释。 1. 一对一关系映射: Hibernate支持一对一(One-to-One)关系映射,这种关系通常存在于具有唯一性的关联表中。通过在实体类中使用`@OneToOne`注解,我们可以定义一对...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...

    Hibernate one to one 实例

    **描述**: 本示例提供了关于Hibernate中一对一关系映射的源代码,其中包含了详细的注释,便于理解和学习。 **标签**: Hibernate **压缩包子文件的文件名称列表**: Hibernate(一对一) 在Java的持久化框架Hibernate...

    Hibernate教程06_关系映射之一对一单向主键关联

    **标题详解:** "Hibernate教程06_关系映射之一对一单向主键关联" 在Hibernate框架中,关系映射是将数据库中的表关系映射到对象模型上的过程。本教程聚焦于一对一(One-to-One)单向主键关联,这是一种特定类型的...

    Hibernate教程19_关系映射案例二

    【描述】提到的链接是一个CSDN博客文章,详细介绍了某个Hibernate关系映射的实例。根据描述,我们可以推测这个教程可能涉及了如何通过Hibernate配置和代码实现数据库表之间的关联,例如一对一、一对多、多对一或多对...

    hibernate源码 直接使用

    描述中的"包括一对一 一对多 和多对多"提到了Hibernate中三种常见的关联关系映射。一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)是实体间的关系类型,它们在数据库设计中广泛存在,并且...

    eclipse项目Hibernate实例

    3. **实体类设计**:学习如何创建表示数据库表的Java类,使用Hibernate的注解(如@Entity、@Table、@Id等)来定义对象-关系映射。 4. **映射文件**:虽然使用注解可以简化映射,但理解`.hbm.xml`文件的结构也很重要...

    Hibernate_code

    1. **Hibernate框架**:Hibernate是一个开源的Java持久化框架,它提供了一种在Java应用中管理关系数据库模型的方式,通过ORM将Java对象与数据库表进行映射,简化了数据库操作。 2. **继承映射**:在Hibernate中,...

    Hibernate教程08_关系映射之联合主键

    在Java的持久化框架Hibernate中,关系映射是将数据库中的表关系映射到对象模型的关键环节。本教程聚焦于“联合主键”这一概念,它在处理复合唯一标识符时非常有用。联合主键(Composite Key)是指由两个或多个字段...

Global site tag (gtag.js) - Google Analytics