`

[原]Hibernate一对多(双向)

阅读更多
[标题]:Hibernate一对多(双向)
[时间]:2009-6-17
[摘要]:Hibernate一对多双向关联,例如一个用户有多张银行卡。
[关键字]:双向关联,Hibernate,ORM,关系数据库,映射,一对多
[环境]:MyEclipse7 ,Hibernate3.2
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
    Hibernate一对多双向关联,例如一个用户有多张银行卡。双向一对多关联在单向一对多(参见"Hibernate一对多(单向)":http://www.blogjava.net/wintys/archive/2009/06/13/hibernate_onetomany.html)的基础上,再对"多"方进行配置。
1、概述
a.实体类:
public class User{
    ...
    private Set<Card> cards;
    ...
}

public class Card{
    ...
    private User user;
    ...
}

b.Hibernate配置文件
根据需要可以将User.hbm.xml中set的属性inverse设置为true
User.hbm.xml:
<set name="cards" inverse="true" cascade="all">
    <key column="userId" />
    <one-to-many class="wintys.hibernate.onetomany.Card" />
</set>

Card.hbm.xml:
<many-to-one   name="user"
                        class="wintys.hibernate.onetomany.User"
                        column="userId"
                        cascade="all" />

c.数据库:
数据库表与单向一对多时并没有区别,还是在"多方"加一个外键"userId"即可。

2、实体类:
User:
package wintys.hibernate.onetomany;

import java.util.Set;

public class User {
    private String id;
    private String name;
    private Set<Card> cards;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void setCards(Set<Card> cards) {
        this.cards = cards;
    }

    public Set<Card> getCards() {
        return cards;
    }   
}

Card:
package wintys.hibernate.onetomany;

public class Card {
    private String id;
    private float balance;
    private User user;/*用于实现反向关联:"多对一"*/
    
    public Card(){
    }
    
    public Card(float balance){
        this.balance = balance;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public float getBalance() {
        return balance;
    }
    public void setBalance(float balance) {
        this.balance = balance;
    }

    public User getUser() {
        return user;
    }

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


3、映射文件:
用户类映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!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 Persistence Tools
-->

<hibernate-mapping>
    <class name="wintys.hibernate.onetomany.User" table="myuser" catalog="db">
        <id name="id" type="string">
            <column name="id" not-null="true"/>
            <generator class="uuid.hex" />
        </id>
        <property name="name" type="java.lang.String" column="name" />
        
        <!-- 当用于实现反向关联:"多对一"-->
        <set name="cards" inverse="true" cascade="all">
            <key column="userId" />
            <one-to-many class="wintys.hibernate.onetomany.Card" />
        </set>
    </class>
</hibernate-mapping>


银行卡映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!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 Persistence Tools
-->

<hibernate-mapping>
    <class name="wintys.hibernate.onetomany.Card" table="mycard" catalog="db">
        <id name="id" type="string">
            <column name="id" not-null="true"/>
            <generator class="uuid.hex" />
        </id>
        <property name="balance" />
        
        <!-- 用于实现反向关联:"多对一" -->
        <many-to-one name="user"
                     class="wintys.hibernate.onetomany.User"
                     column="userId"
                     cascade="all" />
    </class>
</hibernate-mapping>


4、数据库表与"单向一对多"相同。

5、Hibernate配置文件:/src/hibernate.cfg.xml也与"单向一对多"相同。

6、使用测试:
/src/wintys/hibernate/onetomany/HibernateUtil.java与"单向一对多"相同。
/src/wintys/hibernate/onetomany/CardDAO.java:

package wintys.hibernate.onetomany;
import java.util.List;

public interface CardDAO {
    public void insert();
    public List<Card> selectAll();
}


/src/wintys/hibernate/onetomany/CardDAOBean.java:
package wintys.hibernate.onetomany;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class CardDAOBean implements CardDAO {

    public void insert() throws HibernateException {
        Transaction tc = null;
        try{
            Card c1,c2,c3;
            User user;
            Set<Card> cards;
            
            c1 = new Card(7641.96f);
            c2 = new Card(654.8f);
            c3 = new Card(3650f);
            
            user = new User();
            user.setName("Tom");
            
            /*一对多映射*/
            cards = new HashSet<Card>();
            cards.add(c1);
            cards.add(c2);
            cards.add(c3);
            user.setCards(cards);
            
            /*多对一映射*/
            c1.setUser(user);
            c2.setUser(user);
            c3.setUser(user);
            
            Session session = HibernateUtil.getSession();
            tc = session.beginTransaction();
                        
            session.save(c1);
            session.save(c2);
            session.save(c3);
            
            tc.commit();
        }catch(HibernateException e){
            try{
                if(tc != null)
                    tc.rollback();
            }catch(Exception ex){
                System.err.println(ex.getMessage());
            }
            System.err.println(e.getMessage());
        }finally{
            HibernateUtil.closeSession();           
        }
    }

    @SuppressWarnings("unchecked")
    public List<Card> selectAll() throws HibernateException {
        List<Card> cards = null;
        Transaction tc = null;
        try{
            Session session = HibernateUtil.getSession();
            tc = session.beginTransaction();
                        
            Query query = session.createQuery("from Card");
            cards = query.list();
            
            tc.commit();
        }catch(HibernateException e){
            try{
                if(tc != null){
                    tc.rollback();
                    cards = null;
                }
            }catch(Exception ex){
                System.err.println(ex.getMessage());
            }
            System.err.println(e.getMessage());
        }finally{
            //HibernateUtil.closeSession();         
        }
        
        return cards;
    }
}


7、运行结果:

控制台显示:
......
Hibernate: insert into db.myuser (name, id) values (?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: update db.mycard set balance=?, userId=? where id=?
Hibernate: update db.mycard set balance=?, userId=? where id=?
Hibernate: update db.mycard set balance=?, userId=? where id=?
......

id:402881e421eddc240121ede9c5d10009
name:Tom
cards:
    cardId:402881e421eddc240121ede9c5d1000a
    balance:7641.96
    cardId:402881e421eddc240121ede9c5d1000c
    balance:3650.0
    cardId:402881e421eddc240121ede9c5d1000b
    balance:654.8

[参考资料]:
《J2EE项目实训-Hibernate框架技术》 : 清华大学出版社
原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys

分享到:
评论

相关推荐

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate一对多双向

    在探讨“Hibernate一对多双向”这一主题时,我们首先需要理解Hibernate框架以及它在Java开发中的重要性。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库模型相...

    Hibernate一对多双向自身关联demo代码

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    hibernate多对多双向关联

    **标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...

    Hibernate双向一对多

    标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    Hibernate 一对多双向映射及乐观锁使用

    **标题解析:** "Hibernate 一对多双向映射及乐观锁使用" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,能够帮助开发者将数据库操作转化为面向对象的编程,简化了数据访问层的实现。"一对多"是...

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

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

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate双向一对多关联映射(XML)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...

    Hibernate关于注解的一对多,多对多,一对一

    本篇文章将深入探讨Hibernate中注解的一对多、多对多和一对一关系映射。 ### 一对多关系 在现实生活中,例如一个班级有一个班主任,而班主任可以管理多个学生,这就是典型的“一对多”关系。在Hibernate中,我们...

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

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...

    hibernate一对多与多对一

    本篇文章将详细讲解"hibernate一对多与多对一"的关系映射概念,以及如何在实际开发中进行配置和使用。 首先,我们来看一下“一对多”关系。在现实世界中,这种关系可以对应到例如一个班级有多个学生,或者一个人...

    hibernate一对多(双向)有数据库说明

    本篇文章将深入探讨Hibernate中的一对多双向关联,并结合数据库说明其配置与操作。 首先,我们要理解什么是双向关联。在Hibernate的一对多关系中,双向关联意味着双方实体都能访问到对方。例如,不仅"老师"能获取到...

Global site tag (gtag.js) - Google Analytics