利用hibernate解决多对多的问题
1建立实体多对多关系Manytomany,利用hibernate去维护多对多关系,但是hibernate无提供中间表操作。
2在1的基础上,建立中间表,利用一对多关系。
这样可以在中间表添加其他属性,也可以利用hibernate多对多去维护
EG:
学生:ID,name
学科:ID,classname
中间表:sid,cid,SCORE
hibernate: @MANYTOMANY Student,Class_tb
@ManyToOne score ,
eg2:用户,会议多对多关系,中间表记录参加会议的信息
会议
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="djsys_netmeeting"
name="com.gdass.model.djsys.NetMeeting">
<id name="id">
<generator class="native" />
</id>
<property name="dyId" />
<property name="createName" />
<property name="orgid" />
<property name="orgname" />
<property name="title" />
<property name="startDate" />
<property name="endDate" />
<property name="flag" />
<property name="moderator" />
<property name="content" />
<property name="learndata" />
<property name="xmldatapath" />
<property name="toupiao" />
<property name="tpcon" />
<property name="determine" />
<property name="onlinedatapath" />
<property name="chengdu" />
<property name="attachment" />
<property name="seldomtime" />
<property name="noticedata" />
<!--
<map name="dangYuans" table="djsys_user_netmeet" >
<key column="nmid" not-null="true" />
<map-key-many-to-many column="dyid"
class="com.gdass.model.djsys.DangYuan" />
<composite-element
class="com.gdass.model.djsys.UserNetMeet">
<property name="looker_ornot" column="looker_ornot" />
<property name="flag" column="flag" />
</composite-element>
</map> -->
<set table="djsys_user_netmeet" fetch="select" name="dangYuans">
<key column="nmid"/>
<many-to-many column="dyid" class="com.gdass.model.djsys.DangYuan"/>
</set>
<set name="userNetMeets" inverse="true"
cascade="all-delete-orphan">
<key column="nmid" />
<one-to-many class="com.gdass.model.djsys.UserNetMeet" />
</set>
<set name="voteTopics" inverse="true"
cascade="all-delete-orphan">
<key column="nmid" />
<one-to-many class="com.gdass.model.djsys.VoteTopic" />
</set>
</class>
</hibernate-mapping>
用户
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="djsys_dangyuan"
name="com.gdass.model.djsys.DangYuan">
<id name="id">
<generator class="native" />
</id>
<many-to-one name="user" column="uid" />
<many-to-one name="djorg" column="orgid" />
<property name="dangfei" />
<property name="changedate" />
<property name="username" />
<property name="rdsqdate" />
<property name="jjfzdate" />
<property name="fzdxdate" />
<property name="rdlxr" />
<set name="dyOrgs" inverse="true" cascade="all-delete-orphan">
<key column="dangYuanId" />
<one-to-many class="com.gdass.model.djsys.DyOrg" />
</set>
<set name="personAwards" inverse="true"
cascade="all-delete-orphan">
<key column="dangYuanId" />
<one-to-many class="com.gdass.model.djsys.PersonAward" />
</set>
<!--
<map name="netMeetings" table="djsys_user_netmeet">
<key column="dyid" not-null="true" />
<map-key-many-to-many column="nmid"
class="com.gdass.model.djsys.NetMeeting" />
<composite-element
class="com.gdass.model.djsys.UserNetMeet">
<property name="looker_ornot" column="looker_ornot" />
<property name="flag" column="flag" />
</composite-element>
</map> -->
<set table="djsys_user_netmeet" fetch="select" lazy="true" name="netMeetings">
<key column="dyid"/>
<many-to-many column="nmid" class="com.gdass.model.djsys.NetMeeting"/>
</set>
<set table="djsys_user_netword" fetch="select" lazy="true" name="netWords">
<key column="dyid"/>
<many-to-many column="nwid" class="com.gdass.model.djsys.NetWord"/>
</set>
</class>
</hibernate-mapping>
中间表,记录参加会议情况
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="djsys_user_netmeet"
name="com.gdass.model.djsys.UserNetMeet">
<composite-id>
<key-many-to-one name="netMeeting" class="com.gdass.model.djsys.NetMeeting" column="nmid">
</key-many-to-one>
<key-property name="dyid" />
</composite-id>
<property name="vdata" />
<property name="sdata" />
<property name="id" />
<property name="toupiao" />
<property name="ddata" />
<property name="ntype" />
<property name="cuichu" />
</class>
</hibernate-mapping>
分享到:
相关推荐
通过以上步骤,我们就能在Hibernate中有效地管理多对多关联,并利用中间表实现复杂的数据操作。理解并熟练掌握这些知识,对于任何Java开发人员来说都是非常有价值的,特别是在大型企业级应用中,这种关联映射的使用...
在Hibernate中,实现多对多关系需要通过关联表(也称为中间表或连接表)来完成。这个关联表通常包含两个外键,分别对应于两个参与关系的实体。以下是一个具体的步骤详解: 1. **定义实体类**:首先,为参与多对多...
本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关配置和操作。 一、多对多关联概述 在数据库设计中,多对多关联表示两个表之间的关系,如学生和课程的关系,一个学生可以选修多门课程,而...
你可以通过导入这个数据库到你的开发环境中,然后编写相应的代码,执行CRUD操作,来实践和理解Hibernate处理多对多关系的方法。 总结,Hibernate的多对多关系映射是数据库设计中非常重要的一个部分,它简化了Java...
总之,Hibernate的多对多查询涉及实体类的定义、中间表的映射以及查询语句的编写。理解和熟练运用这些概念对于开发复杂的Java应用程序至关重要。在实际项目中,应根据业务需求灵活调整关联策略,确保数据的一致性和...
虽然多对多关联方便了数据操作,但也可能导致性能问题,因为每次关联操作都需要涉及中间表。在大数据量的场景下,可能需要优化查询策略,比如使用JOIN查询而非多次单独查询,或者在业务层缓存部分关联数据。 总结,...
通过查看代码和运行示例,开发者可以深入理解Hibernate是如何自动处理复杂的关联操作,比如通过中间表实现多对多的添加、删除和查找。 **总结** 这个"Hibernate多对多实例+数据库代码"涵盖了ORM的核心概念,特别是...
在这个例子中,通过调用`save`方法,Hibernate会自动处理插入到中间表的操作,确保多对多关系的正确建立。 总结来说,使用Hibernate处理多对多关系,关键在于理解`@ManyToMany`注解的使用,中间实体类的设计(如果...
在Hibernate中,多对多关系通常通过中间表来实现,这个中间表包含了两个实体的主键作为外键。你需要在实体类中定义对应的集合属性,并在对应的`@ManyToMany`注解中指定关联的实体和中间表的信息。例如: ```java ...
- 多对多关系通常需要一个中间表来存储两个实体的关联。在这个例子中,可能有一个名为`student_course`的中间表,包含`student_id`和`course_id`两个字段,分别引用学生和课程的主键。 4. **JPA实体(Entities)**...
标题“hibernate 多对多操作”表明了本文将探讨的是在Java编程中,使用Hibernate框架处理数据库中的多对多关联关系。Hibernate是Java领域广泛使用的对象关系映射(ORM)工具,它允许开发者用面向对象的方式处理...
2. **@JoinTable**:多对多关系通常需要一个中间表来存储双方的关联,`@JoinTable`用来定义这个中间表,包括它的名字、连接的列名等。 ```java @Entity public class User { @ManyToMany @JoinTable(name = "user...
在上述代码中,`@ManyToMany`注解定义了多对多关联,`@JoinTable`指定了中间表的名称和连接列。`mappedBy`属性用于指定另一端的关联字段,这表示`Course`实体的`students`集合是由`Student`实体的`courses`集合维护...
3. **中间表**:多对多关系通常需要一个中间表来存储两个表的连接。在Hibernate中,可以通过`@JoinTable`注解定义这个中间表,包括它的名字、连接两个实体的外键等信息。 4. **关联维护**:双向关联需要在两个实体...
6. **源码分析**:为了更好地理解这一过程,你可以查看Hibernate源码,了解它如何处理多对多关联的SQL语句生成、中间表的操作以及事务管理。这有助于提高对Hibernate框架的理解。 通过以上步骤,我们可以在...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个表的外键。 三、配置多对多映射 在Hibernate中,配置多对多映射通常需要以下几个步骤: 1. **实体类定义**:为每个实体...
在上述代码中,我们使用了注解`@ManyToOne`和`@JoinColumn`来声明`Address`类中的`person`字段是一个多对一的关联,并指定了外键列的名称。 3. 数据库表结构:`personAdd.sql`可能包含了创建`Person`和`Address`表...
在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...