`

Hibernate 多对多映射实列 (复合主键)

阅读更多
               <id name="id" type="integer">
			<column name="userId" />
			<generator class="sequence">
				<param name="sequence">SEQ_IRCS_USER_ID</param>
			</generator>
	</id>
..................
       <set name="ircsGroups" table="TB_IRCS_USERGROUP" lazy="true" inverse="false"  cascade="save-update" batch-size="5"  sort="unsorted" >
            <key column="userId"/>
            <many-to-many class="net.p5w.common.po.ircs.IrcsGroup">
            <column name="groupCode"  not-null="true"  length="12"></column>
            <column name="stockcode"  not-null="true"   length="8" ></column>
            <column name="stocktype"  not-null="true"  length="1" ></column>
            </many-to-many>
        </set>
 以上为:IrcsUser.hbm.xml

 

 

 

 

	<composite-id>
			<key-property name="groupCode" type="string">
				<column name="groupCode" length="12" />
			</key-property>		
			<key-property name="stockCode" type="string">
				<column name="stockcode" length="8" />
			</key-property>
			<key-property name="stockType" type="string">
				<column name="stocktype" length="1" />
			</key-property>
	</composite-id>



<set name="ircsUsers" table="TB_IRCS_USERGROUP" lazy="true" inverse="false"  cascade="save-update" batch-size="5" sort="unsorted">
            <key>
            <column name="stockcode"  not-null="true"  length="8" ></column>
            <column name="stocktype"  not-null="true"  length="1" ></column>
            <column name="groupCode"  not-null="true"  length="12"></column>
            </key>
            <many-to-many class="net.p5w.common.po.ircs.IrcsUser" column="userId"/>
        </set> 
 以上为:IrcsGroup.hbm.xml

 

注意:set中的key 的顺序与实体类的属性顺序一致!!!!

 

 

分享到:
评论
2 楼 txy821 2010-03-19  
Hibernate 3.0.5

1、Usergroup.hbm.xml 用户组表
         <set name="users" table="Groupandusers" lazy="true" inverse="false" cascade="save-update" sort="unsorted">
            <key column="GROUPID"/>
            <many-to-many class="cn.com.commnet.model.systems.Users" column="USERID" outer-join="auto"/>
        </set>


2、Users.hbm.xml 用户表
        <set name="groups" table="Groupandusers" lazy="true" inverse="false" cascade="save-update" sort="unsorted" >
            <key column="USERID"/>
            <many-to-many class="cn.com.commnet.model.systems.Usergroup" column="GROUPID" outer-join="auto"/>
        </set>

3、Model  Usergroup.java
private Set users = new HashSet();
public Set getUsers() {
        return users;
    }

    public void setUsers(Set users) {
        this.users = users;
    }
   
    public void addUser(RgUsers user) {
        users.add(user);
    }
   
    public void updateUsers(Set newUserset){
        //get intersection elements 取交集
        this.getUsers().retainAll(newUserset);
        //get the refresh set in new set 新的集合中取补集
        newUserset.removeAll( this.getUsers());
        //get the refreshed data 最终的集合
        this.getUsers().addAll(newUserset);
    }

4、Model    Users.java
private Set groups = new HashSet();

    public Set getGroups() {
        return groups;
    }

    public void setGroups(Set groups) {
        this.groups = groups;
    }
   
    public void addGroup(RgUsergroup group) {
        groups.add(group);
    }
   
    public void updateGroups(Set newGroupset){
        //get intersection elements 取交集
        this.getGroups().retainAll(newGroupset);
        //get the refresh set in new set 新的集合中取补集
        newGroupset.removeAll( this.getGroups());
        //get the refreshed data 最终的集合
        this.getGroups().addAll(newGroupset);
    //父接点一侧的配置应为 cascade="all-delete-orphan" ,
    //否则子接点只能修改和新增,集合中删除掉的子接点,在数据库中并没有被删除掉。
    }

5、Service 层  UserManager.java
            a). add 方法:
            String[] groupList = form.getGroupList();
             for(int i=0;i<groupList.length;i++) {
                 RgUsergroup group = new UserGroupDAO().getGroupById(Long.valueOf(groupList[i]),false);
                 user.addGroup(group);
             }
            dao.save(user);
           b). update 方法:
            Set newGroupset = new HashSet();
             String[] groupList = form.getGroupList();
             for(int i=0;i<groupList.length;i++) {
                 RgUsergroup group = new UserGroupDAO().getGroupById(Long.valueOf(groupList[i]),false);
                 newGroupset.add(group);
             }
             user.updateGroups(newGroupset);   //更新多对多对应表
            dao.update(user);

    另外, 多对多, 及一对多的关联查询时, 通过外键属性的条件进行查询, 如:
    String strSql = "from Users t where t.groups.groupid =?"

0 0 0
(请您对文章做出评价)
1 楼 txy821 2010-03-19  
IrcsUser.hbm.xml 正确定法:

        <set name="ircsGroups" table="TB_IRCS_USERGROUP" lazy="false" inverse="false" cascade="save-update"  batch-size="5"  sort="unsorted" >
            <key column="userId"/>
            <many-to-many class="net.p5w.common.po.ircs.IrcsGroup"  outer-join="auto">
            <column name="groupCode"  not-null="true"  length="12"></column>
            <column name="stockcode"  not-null="true"   length="8" ></column>
            <column name="stocktype"  not-null="true"  length="1" ></column>
            </many-to-many>
        </set>

IrcsGroup.hbm.xml正确写法:

        <set name="ircsUsers" table="TB_IRCS_USERGROUP" lazy="false" inverse="false"  cascade="save-update" batch-size="5" sort="unsorted">
            <key>
            <column name="groupCode"  not-null="true"   length="12"></column>
            <column name="stockcode"  not-null="true"   length="8" ></column>
            <column name="stocktype"  not-null="true"  length="1" ></column>
            </key>
            <many-to-many class="net.p5w.common.po.ircs.IrcsUser"   outer-join="auto" column="userId"/>
        </set>

cascade="save-update" 改成 cascade="all-delete-orphan" 要慎用。。它不仅会删除中间表,还会把对关联的表记录也会删除。
当只要求删除中间表时,只需要加outer-join="auto"

相关推荐

    hibernate多对多关联映射

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

    hibernate 无主键表映射

    在Hibernate中,对无主键表的操作与普通实体基本相同,只是在保存和查询时需要传入整个复合主键对象。例如,创建一个新的订单: ```java OrderKey key = new OrderKey(); key.setCustomerId("123"); key.setOrderId...

    hibernate复合主键映射

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据模型,它用于表示由多个属性共同构成的唯一标识。这种设计通常出现在实体类的某些属性组合起来才能唯一确定一个对象的情况下。本篇文章将...

    hibernate单向多对多映射(XML版)

    本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...

    Hibernate一对一主键映射

    在Java的持久化框架Hibernate中,一对一(One-to-One)主键映射是一种常见的关联关系。这种映射方式使得两个实体类共享同一个主键,从而建立一对一的关系。在这个实例中,我们将深入探讨Hibernate一对一主键映射的...

    hibernate复合主键配置和使用

    3. 在使用复合主键时,要注意避免在多对一或一对多关系中直接使用复合主键作为外键,这可能导致映射问题。 总结,Hibernate对复合主键的处理为开发者提供了灵活性,使得处理复杂数据模型变得更加便捷。通过正确配置...

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

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

    hibernate 主键一对一映射(单向) 实例(java类)

    本实例将深入探讨如何在Hibernate中实现主键级别的单向一对一映射。 首先,我们理解一对一映射的基本概念。在数据库设计中,一对一映射通常发生在两个表的主键之间,其中一个表的主键是另一个表的外键。在Hibernate...

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

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

    Hibernate复合主键

    "Hibernate复合主键" Hibernate复合主键是指在 Hibernate 框架中使用复合主键来唯一标识一个实体。复合主键是指由多个字段组成的主键,用于唯一标识一个实体。在本例中,我们将通过一个简单的复合主键的做关联类的...

    Hibernate多对多的映射

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)映射是一种常见的关系模型,用于处理两个实体之间存在多个对应关系的情况。本文将深入探讨Hibernate如何实现多对多映射,以及相关的源码解析和工具使用。 在...

    hibernate复合主键设置

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本教程将深入探讨如何在Hibernate中设置复合主键,并提供一个可直接使用的配置示例。 ...

    hibernate(一对多,多对一映射)操作

    本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    Hibernate一对一主键关联映射(单向关联)

    总结来说,Hibernate中的一对一主键关联映射允许两个实体共享同一个主键,实现单向关联时只需在依赖方添加对另一方的引用。在实际应用中,应根据业务需求谨慎选择关联类型,以确保数据的完整性和一致性。

    Hibernate一对多主键关联映射源代码

    本教程通过源代码的形式,讲解如何在Hibernate中实现一对多主键关联映射,适用于初学者学习。 首先,我们需要理解一对多关联的基本概念。在数据库中,一个表的某一列(主键)可能与另一个表的多行相关联,比如一个...

    hibernate多对一关联映射

    **标题:Hibernate多对一关联映射** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作。"多对一"关联映射是Hibernate中的一种常见关系类型,用于表示实体...

Global site tag (gtag.js) - Google Analytics