`
KuangYeYaZi
  • 浏览: 55782 次
文章分类
社区版块
存档分类
最新评论

Hibernate入门之多对多实体映像

 
阅读更多

多对多实体映像 
 假设现在有User与Server两个类别,一个User可以被授权使用多台Server,而在Server上也记录授权使用它的使用者,就User与Server两者而言即使多对多的关系。 
 在程序设计时,基本上是不建议直接在User与Server之间建立多对多关系,这会使得User与Server相互依赖,通常会透过一个中介类别来维护两者之间的多对多关系,避免两者的相互依赖。 
 如果一定要直接建立User与Server之间的多对多关系,Hibernate也是支持的,基本上只要您了解之前介绍的几个实体映像,建立多对多关联在配置上并不困难。 
 先看一下我们设计的User与Server类别: 
User.java 

package onlyfun.caterpillar; 

import java.util.*; 

public class User { 
private long id; 
private String name; 
private Set servers = new HashSet(); 

public long getId() { 
return id; 
} 
public void setId(long id) { 
this.id = id; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public Set getServers() { 
return servers; 
} 

public void setServers(Set servers) { 
this.servers = servers; 
} 
} 

 Server.java 

package onlyfun.caterpillar; 

import java.util.*; 

public class Server { 
private long id; 
private String address; 
private Set users = new HashSet(); 

public long getId() { 
return id; 
} 
public void setId(long id) { 
this.id = id; 
} 
public String getAddress() { 
return address; 
} 
public void setAddress(String address) { 
this.address = address; 
} 
public Set getUsers() { 
return users; 
} 
public void setUsers(Set users) { 
this.users = users; 
} 
} 

 这边各使用HashSet来保存彼此的关系,在多对多关系映射上,我们可以建立单向或双向关系,这边直接介绍双向关系映像,并藉由设定inverse= "true",将关系的维护交由其中一方来维护,这么作的结果,在原始码的撰写上,也比较符合Java的对象关系维护,也就是双方都要设置至对方的参考。 

 首先来看看User.hbm.xml: 
User.hbm.xml 

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

<hibernate-mapping> 

<class name="onlyfun.caterpillar.User" table="USER"> 

<id name="id" column="USER_ID" unsaved-value="0"> 
<generator class="increment"/> 
</id> 

<property name="name"> 
<column name="NAME" length="16" not-null="true"/> 
</property> 

<set name="servers" 
table="USER_SERVER" 
cascade="save-update"> 

<key column="USER_ID"/> 
<many-to-many class="onlyfun.caterpillar.Server" 
column="SERVER_ID"/> 
</set> 

</class> 

</hibernate-mapping>

 在数据库中,数据表之间的多对多关系是透过一个中介的数据表来完成,例如在这个例子中,USER数据表与USER_SERVER数据表是一对多,而 USER_SERVER对SERVER是多对一,从而完成USER至SERVER的多对多关系,在USER_SERVER数据表中,将会有USER_ID 与SERVER_ID共同作为主键,USER_ID作为一个至USER的外键参考,而SERVER_ID作为一个至SERVER的外键参考。 

 来看看Server.hbm.xml映射文件: 
Server.hbm.xml 

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

<hibernate-mapping> 

<class name="onlyfun.caterpillar.Server" table="SERVER"> 

<id name="id" column="SERVER_ID" unsaved-value="0"> 
<generator class="increment"/> 
</id> 

<property name="address" type="string"/> 

<set name="users" 
table="USER_SERVER" 
inverse="true" 
cascade="save-update"> 

<key column="SERVER_ID"/> 
<many-to-many class="onlyfun.caterpillar.User" 
column="USER_ID"/> 
</set> 
</class> 

</hibernate-mapping> 

 设置上与User.hbm.xml是类似的,只是增加了inverse="true",表示将关系的维护交由另一端,注意我们在User与 Server的cascade都是设置为save-update,在多对多的关系中,all、delete等cascade是没有意义的,因为多对多中,并不能因为父对象被删除,而造成被包括的子对象被删除,因为可能还有其它的父对象参考至这个子对象。 

 我们使用下面这个程序来测试: 
HibernateTest.java 

import onlyfun.caterpillar.*; 
import net.sf.hibernate.*; 
import net.sf.hibernate.cfg.*; 

public class HibernateTest { 
public static void main(String[] args) throws HibernateException { 
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

Server server1 = new Server(); 
server1.setAddress("PC-219"); 
Server server2 = new Server(); 
server2.setAddress("PC-220"); 
Server server3 = new Server(); 
server3.setAddress("PC-221"); 

User user1 = new User(); 
user1.setName("caterpillar"); 
User user2 = new User(); 
user2.setName("momor"); 

user1.getServers().add(server1); 
user1.getServers().add(server2); 
user1.getServers().add(server3); 
server1.getUsers().add(user1); 
server2.getUsers().add(user1); 
server3.getUsers().add(user1); 

user2.getServers().add(server1); 
user2.getServers().add(server3); 
server1.getUsers().add(user2); 
server3.getUsers().add(user2); 

Session session = sessionFactory.openSession(); 
Transaction tx= session.beginTransaction(); 
session.save(user1); 
session.save(user2); 

tx.commit(); 
session.close(); 

sessionFactory.close(); 
} 
} 

 注意由于设定了inverse="true",所以必须分别设定User与Server之间的相互参考,来看看实际上数据库中是如何储存的: 

mysql> select * FROM USER; 
+---------+-------------+ 
| USER_ID | NAME | 
+---------+-------------+ 
| 1 | caterpillar | 
| 2 | momor | 
+---------+-------------+ 
2 rows in set (0.00 sec) 

mysql> select * FROM USER_SERVER; 
+-----------+---------+ 
| SERVER_ID | USER_ID | 
+-----------+---------+ 
| 1 | 1 | 
| 2 | 1 | 
| 3 | 1 | 
| 1 | 2 | 
| 2 | 2 | 
+-----------+---------+ 
5 rows in set (0.00 sec) 

mysql> select * FROM SERVER; 
+-----------+---------+ 
| SERVER_ID | address | 
+-----------+---------+ 
| 1 | PC-219 | 
| 2 | PC-221 | 
| 3 | PC-220 | 
+-----------+---------+ 
3 rows in set (0.00 sec) 
 有关于多对多更多的例子与说明,您可以参考Hibernate in Action的6.3。

分享到:
评论

相关推荐

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate学习入门一对多实体映射源码

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

    Hibernate入门到精通

    "Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...

    Hibernate入门jar包

    本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之配合使用的相关组件。让我们深入探讨一下这些jar包以及它们在Hibernate中的作用。 1. Hibernate核心库: - `hibernate-core.jar`:这...

    初学hibernate,hibernate入门

    **初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    Hibernate入门(代码+笔记)

    总结来说,本教程涵盖了Hibernate的基础知识,从入门到实体映射,再到复合主键和实体层设计,旨在帮助初学者快速掌握Hibernate的使用,从而更高效地进行数据库操作。通过实践这些知识点,你将能够熟练地在Java应用中...

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    Hibernate入门

    ### Hibernate入门知识点详解 #### Hibernate概述与ORM思想 - **定义**:Hibernate是一个开源的、轻量级的对象关系映射(Object-Relational Mapping,简称ORM)框架,它主要应用于JavaEE架构中的DAO(Data Access ...

    Hibernate入门到精通.pdf

    最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    hibernate入门

    Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml &lt;!-- User.hbm.xml --&gt; &lt;!-- Order.hbm.xml --&gt; ``` 以上就是Hibernate入门的基础内容。...

    Hibernate入门教程.pdf

    相比之下,Hibernate则更加自动化,能够根据实体类自动生成相应的SQL语句,进一步减少了开发者的负担。 通过上述知识点的学习,初学者可以更好地理解Hibernate的核心概念和技术优势,并逐步掌握其基本用法,为...

    java基础入门之Hibernate 入门

    在这个“Java基础入门之Hibernate入门”中,我们将深入理解Hibernate的核心概念,包括实体、配置、会话和查询等,以帮助初学者快速上手。 ### 一、Hibernate简介 1. **ORM概念**:对象关系映射(Object-Relational...

    hibernate多对多查询

    在Hibernate中,处理多对多关系需要定义两个实体类,每个实体类对应一个表,并在其中一个或两个实体类中声明`@ManyToMany`注解。这个注解用于表示两个实体之间的多对多关联。例如,我们有`Student`和`Course`两个类...

    MyEclipse Hibernate 快速入门中文版

    本快速入门教程首先会介绍Hibernate的核心概念,如实体类(Entity)、持久化(Persistence)、会话(Session)和查询语言(HQL)。实体类是与数据库表相对应的Java类,持久化则涉及到如何将这些对象保存到数据库中。...

Global site tag (gtag.js) - Google Analytics