`
mrzhangtufu
  • 浏览: 61968 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

多对多连接表双向关联

阅读更多

多对多连接表双向关联时:只能有一端的<set>放入属性inverse="true",之后Session.save()时,首先保存哪个端POJO均可,当另一端的POJO必须调用saveOrUpdate()进行相应的链接和连接表的更新。

示例:

一个Person可以有多个Address,一个Address可以有多个Person。利用连接表进行双向链接:

数据库表:
CREATE TABLE `address_nn_sx` (
 `addressid` int(11) NOT NULL auto_increment,
 `addressdetail` varchar(255) default NULL,
 PRIMARY KEY (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
 
CREATE TABLE `person_nn_sx` (
 `personid` int(11) NOT NULL auto_increment,
 `name` varchar(255) default NULL,
 `age` int(11) default NULL,
 PRIMARY KEY (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
 
CREATE TABLE `join_nn_sx` (
 `addressid` int(11) NOT NULL,
  `personid` int(11) NOT NULL,
  PRIMARY KEY (`personid`,`addressid`),
  KEY `FK6EBBC5EF6C600921` (`personid`),
  KEY `FK6EBBC5EF2A92FF3D` (`addressid`),
  CONSTRAINT `FK6EBBC5EF2A92FF3D` FOREIGN KEY (`addressid`) REFERENCES `address_nn_sx` (`addressid`),
  CONSTRAINT `FK6EBBC5EF6C600921` FOREIGN KEY (`personid`) REFERENCES `person_nn_sx` (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
 


POJO(省去getter,setter):

 
public class Personnn_sx {
 
 private int personid;
 
 private String name;
 
 private int age;
 
 private Set addresses=new HashSet();
 
 
public class Addressnn_sx {
 
 private int addressid;
 
 private String addressdetail;
 
 private Set persons = new HashSet();
 

hbm.xml:

<hibernate-mapping>
    <class name="com.Addressnnsx" table="address_nn_sx">
        <id column="addressid" name="addressid" type="int">
            <generator class="identity"/>
        </id>
        <property name="addressdetail" column="addressdetail" type="string"/>
        <set name="persons" table="join_nn_sx">
            <key column="addressid"/>
            <many-to-many column="personid" class="com.Personnnsx"/>
        </set>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.Personnnsx" table="person_nn_sx">
        <id column="personid" name="personid" type="int">
            <generator class="identity"/>
        </id>
        <property name="name" column="name" type="string"/>
        <property name="age" column="age" type="int"/>

        <set table="join_nn_sx"
        name="addresses" cascade="all" inverse="true">
            <key column="personid"/>
            <many-to-many class="com.Addressnnsx"
             column="addressid"/>
        </set>
    </class>
</hibernate-mapping>

Test Main:

public class Test_nn_sx {
    public static void main(String args[]){
        Addressnnsx add1=new Addressnnsx();
         Addressnnsx add2=new Addressnnsx();
         Personnnsx p1=new Personnnsx();
         Personnnsx p2=new Personnnsx();
         add1.setAddressdetail("郑州市经三路");
         add2.setAddressdetail("合肥市宿州路");
         p1.setName("wang");
         p1.setAge(30);
         p2.setName("zhang");
         p2.setAge(22);

         add1.getPersons().add(p1);
         add2.getPersons().add(p1);
         add2.getPersons().add(p2);
         p1.getAddresses().add(add1);
         p1.getAddresses().add(add2);
         p2.getAddresses().add(add2);
        
         Session session= HibernateUtil.getSession();
         Transaction tx=session.beginTransaction();
         session.save(add1);
         session.save(add2);
         session.saveOrUpdate(p1);
         session.saveOrUpdate(p2);

         //session.save(p1);
         //session.save(p2);
         //session.saveOrUpdate(add1); //上面的save()已经对相应的address进行插入操作,故这里必须检查相应的表是否需要更新再保存
         //session.saveOrUpdate(add2);
         tx.commit();
         HibernateUtil.closeSession();
    }
}

分享到:
评论

相关推荐

    Hibernate ORM - 多对多双向连接表关联关系

    在Hibernate中,实现多对多双向关联主要涉及以下步骤: 1. **配置实体类**:首先,你需要为每个参与关联的实体定义一个Java类,并添加相应的属性。例如,对于“学生-课程”关系,可以有`Student`和`Course`类,它们...

    Hibernate ORM - 一对多双向连接表关联关系

    “Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...

    多对多双向关联

    在实际项目中,多对多双向关联可能会引发性能问题,因为每次查询可能涉及更多的表连接。为了优化,可以考虑使用单向关联,或者使用中间实体(带有额外属性的关联表)来减少JOIN操作。 此外,当处理大量数据时,批量...

    hibernate多对多双向关联

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

    JPA中的多对多双向关联实体定义与注解设置

    总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...

    13_jpa多对多双向关联实体定义与注解

    本篇将详细讲解JPA中的一个关键概念——多对多双向关联,并通过实体定义与注解设置来深入理解这一特性。"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与...

    mybatis系列三:一对多双向关联

    总之,MyBatis的一对多双向关联提供了丰富的数据模型映射能力,使得在Java对象和数据库表之间建立复杂关系变得更加容易。通过合理配置映射文件和Java实体,以及充分利用MyBatis提供的工具,可以高效地管理这些关联...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...

    Hibernate关联映射

    9. Hibernate 一对一外键双向关联、主键双向关联、连接表双向关联、一对多外键双向关联、一对多连接表双向关联、多对多双向关联: 这些关联方式与单向关联类似,区别在于两个实体类都知道彼此的关联。在双向关联中...

    hibernate 多表关联 中间表

    3. **双向关联**:如果两个实体类之间是双向关联,需要在一方使用`mappedBy`属性,指明关联的属性。如上所示,Role类中的`users`属性就是User类中`roles`属性的引用。 4. **持久化操作**:在业务逻辑中,可以通过...

    hibernate双向多对多关联映射(注解版)

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为...在实际开发中,应根据业务需求来决定是否使用双向关联,以及如何维护这种关系,以避免可能出现的数据不一致问题。

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

    在Hibernate中,多对多关联可以通过定义双向或单向的关联来实现。"单项关联"通常指的是只在一个实体类中定义了与另一个实体的关联,而在另一个实体类中没有对应的引用。这可以通过使用`@ManyToMany`注解来完成。 ...

    Hibernate ORM - 多对多双向中间实体关联关系

    在Hibernate中,我们可以创建一个中间实体类来表示这个中间表,同时在两个主实体类上设置双向关联。 中间实体关联关系的配置主要包括以下几个步骤: 1. **定义中间实体类**:创建一个新的Java类,代表中间表,通常...

    JPA中实现双向多对多的关联关系示例代码

    这样,JPA会自动处理中间表的插入,实现双向多对多的关联。 在查询时,我们可以通过一个实体直接获取另一个实体的关联集合。例如,如果我们想知道`Course`实例`course1`对应的学生,只需调用`course1.getStudents()...

    hibernate实体关联关系映射

    - 连接表双向关联 2. **一对多关联**(One-to-Many / Many-to-One) - 外键单向关联 - 连接表单向关联 - 外键双向关联 - 连接表双向关联 3. **多对多关联**(Many-to-Many) - 单向关联 - 双向关联 每种...

    myeclipse试用小记----Hibernate多对一双向关联(2)

    在本篇【myeclipse试用小记----Hibernate多对一双向关联(2)】中,博主主要探讨了使用MyEclipse集成开发环境与Hibernate框架进行多对一双向关联的配置与实现。MyEclipse是Eclipse的一个强大扩展,特别适合Java Web...

    Hibernate Annotation 共享主键一对一双向关联

    在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一对多、多对一、多对多等。本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared ...

Global site tag (gtag.js) - Google Analytics