`
aine_pan
  • 浏览: 44849 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hibernate 学习之 多对多关联

阅读更多
Hibernate的关联关系看上去非常的头疼,不静下心来好好理理还是搞不清楚他到底什么什么玩意的。
背景:用户和权限(Function)之间的关系是多对多的关系,即一个一个用户可以有多个Function,而一个function也可以被多个用户所有。
问题:如何是用Hibernate来方便的维护二者之间的关系?

表建立:
FUNCTION表用来存储所有的function:
CREATE TABLE "MYTRX"."FUNCTION"
(
	ID NUMBER NOT NULL,
	FUNC_NAME varchar2(20) NOT NULL,
    CONSTRAINT FUNCTION_PK primary key (ID)
);

USER_INFO表用来存储所有的user信息:
CREATE TABLE "MYTRX"."USER_INFO"
(
	ID NUMBER NOT NULL,
	USER_NAME varchar2(20) NOT NULL,
    CONSTRAINT USER_INFO_PK primary key (ID)
); 

我们还需要一个关系表USER_FUNCTION来存储两者的关系:
CREATE TABLE "MYTRX"."USER_FUNCTION"
(
	USER_ID NUMBER NOT NULL,//这里应该是外键
	FUNC_ID NUMBER NOT NULL,//这里应该是外键
   	CONSTRAINT USER_FUNCTION_PK primary key (USER_ID, FUNC_ID)
)

其实只要Hibernate中主外键的关系设好了,DB层的主外键关系就无所谓了,因为事物关系通过Hibernate实现了。

ORM就是简单的属性构造器,我就不列举了。必须要注意的是在Function的ORM中必须要有一个private Set user=new HashSet();属性用来存储当前function被哪些user拥有,同样在User Info的ORM中必须要有一个private Set function=new HashSet();属性用来存储当前的user拥有哪些function。

看配置文件:
<?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">
<hibernate-mapping>
    <class name="com.mmif.ORM.MMIFAdmin" table="USER_INFO" catalog="MYTRX">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" >
            <param name="sequence">S_USER_INFO_ID</param>
            </generator>
        </id>
        <property name="userName" type="java.lang.String">
            <column name="USER_NAME" length="20" />
        </property>      
        <set name="function"
             table="USER_FUNCTION"
             lazy="false"
             cascade="all">
            <key column="USER_ID" not-null="true"/>
            <many-to-many column="FUNC_ID"
                          class="com.mmif.ORM.MMIFFunction"/>
        </set>
    </class>
</hibernate-mapping>

注意set中个各个属性:
name是ORM中的属性名
table是关系表名,是DB中真实的表名,使用时需要直接用它拼SQL语句的
lazy表示是否延迟加载,理解成如果选true,系统在加载hibernate的时候就把本配置文件中表示的两者关系加载了,相应的SQL语句已经执行了。如果选false,系统只会在调用当前配置文件中的两者关系是才会执行相应的SQL查询数据等。
cascade就是表示级联操作的等级,是all或者update或者delete,不列举了
key表示当前表在关系表中的外键名称,可以是多个。必须是DB中真实的名称
many-to-many表示多对多的关系类型
column表示加载项在关系表中的外键名称,必须是DB中真实的名称
class表示加载项的ORM

<?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">
<hibernate-mapping>
    <class name="com.mmif.ORM.MMIFFunction" table="FUNCTION" catalog="MYTRX">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" >
            <param name="sequence">S_FUNCTION_ID</param>
            </generator>
        </id>
        <property name="funcName" type="java.lang.String">
            <column name="FUNC_NAME" length="20" />
        </property>        
         <set name="user"
             inverse="true"
             lazy="false"
             table="USER_FUNCTION">
            <key column="FUNC_ID"/>
            <many-to-many column="USER_ID"
                          class="com.mmif.ORM.MMIFAdmin"/>
        </set>
    </class>
</hibernate-mapping>

这里多了一个属性 inverse="true",表示是谁触发更新的意思。

自此hibernate的配置就完成了,下面就是在系统中的应用了,大家应该都了解了。

记录以备查阅。
分享到:
评论

相关推荐

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate多对多双向关联

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

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

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

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

    hibernate实现多对多关联关系源码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本源码示例将深入探讨如何使用Hibernate来配置和管理这种复杂的...

    hibernate学习资料大全

    【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。...希望这些资料能对CSDN的网友们在Hibernate学习之路上提供宝贵的帮助。

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

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    Hibernate多对多关联添加及查询示例

    `hibernate_manytomany_1.jpg`和`hibernate_manytomany_2.jpg`可能包含了多对多关联的配置或操作示意图,而`Hibernate_manytomanyTest.rar`和`accpDB.rar`则可能是相关的源代码或数据库文件,供学习者下载并运行测试...

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    Hibernate多对多关联关系demo

    通过这个"Hibernate多对多关联关系demo",开发者可以学习如何在实际项目中设置和操作多对多关联,同时理解这些关联关系可能带来的性能和设计挑战。通过练习和实践,你将能够熟练地在Hibernate环境中管理复杂的实体...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    hibernate3.2(六)多对一关联映射

    在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...

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

    通过源码学习,你可以深入了解Hibernate如何处理多对多关系的细节,从而更好地应用到实际项目中。在实际编程时,注意合理设计实体关系,确保数据的一致性和完整性,同时利用Hibernate的便捷性提高开发效率。

    Hibernate学习之 : 一对多关联映射

    在Java世界中,ORM(对象关系映射)框架如...总之,理解并熟练运用Hibernate的一对多关联映射是提升Java企业级开发效率的关键技能之一。通过不断的实践和学习,开发者可以更好地应对各种复杂的数据库操作需求。

    hibernate 全面学习->hibernate 关联映射学习

    本篇文章将全面探讨Hibernate的关联映射学习,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many)四种关系映射。 首先,一对一关联映射(One-to-One)是两个实体...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

Global site tag (gtag.js) - Google Analytics