`
aine_pan
  • 浏览: 43843 次
  • 性别: 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学习:单向多对一关联 工程

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

    hibernate关联映射实例

    该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品

    Hibernate学习要点_one2one 一对一主键双线关联

    Hibernate学习要点:一对一主键关联双向

    hibernate如何实现一对多的关联源代码

    是用hibernate实现一对多的关联对初学javaee有一定的帮助希望大家努力学习呀

    Hibernate学习资料(java)

    Hibernate一对一数据关联 Hibernate下的多对多关系 Hibernate关系映射 Hibernate继承关系映射 Hibernate映射类型-主键生成器-核心API Hibernate3 插件Eclipse配置

    hibernate一对一关联关系

    免积分的资源,希望可以帮到大家,这是我学习hibernate时候,自己写的代码。希望大家学业有成。

    hibernate学习笔记

    hibernate多对一关联映射(Hibernate_Many2One) 7 hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射...

    hibernate一对多关联映射学习小结

    主要介绍了hibernate一对多关联映射学习小结,需要的朋友可以参考下

    Hibernate学习笔记

    008 多对一 关联映射 009 一对一 主键关联映射_单向 010 一对一 主键关联映射_双向 011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush 014 一对多关联映射 单向 015 一对多关联...

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

    博文链接:https://ag-bruce.iteye.com/blog/213436

    hibernate学习5之one-to-many双向关联.docx

    如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多的一端来维护关联关系。 加上inverse="true"这个属性,就可以强制在多的一端维护关系了。

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

    Hibernate关联映射.rar

    使用hibernate的多对一,一对多的关联,用idea环境搭建,适合刚刚开始学习hibernate搭建的同学看看

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。

    hibernate实体关联关系映射

    Hibernate实体关联关系映射--学习总结,让同仁们更好的学习Hiebernate

    Spring和Hibernate学习笔记

    第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的方式) 第五课:spring对AOP...

    Hibernate中文详细学习文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

Global site tag (gtag.js) - Google Analytics