`

hibernate基础-映射关系(一对多I多对多).

阅读更多
一对多关联映射(one-to-many)
一对多关联映射利用了多对一关联映射原理
  * 多对一关联映射:在多的一端加和一个外键指向一的一端,它维护的关系是多指向一的
  * 一对多关联映射:在一的一端加和一个外键指向多的一端,它维护的关系是一指向多的
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同,一般都作成双项的
------------------------------------------------------------------------------
1 一对多关联映射(单项Classes--->Student)
在一一端维护关系的缺点:
  * 如果将t_student表里的classesid这段设置为非空,则无法保存
  * 因为不在student这一端维护关系,所以student不知道是哪个班的
    所以需要发出多余的update语句来更新关系
<!--
  Classes:                                  Student:
    private int id;                         private int id;
    private String name;             private String name;
    private Set students;//必须用Set
-->
<class name="com.my.hibernate.Student">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
</class>

<class name="Classes">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<set name="students">
            
<key column="classesid"/>
            
<one-to-many class="Student"/>
        
</set>
</class>
public void testSave1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
            Student student1
=new Student();
            student1.setName(
"10");
            session.save(student1);
//先进行save操作
            
            Student student2
=new Student();
            student2.setName(
"祖儿");
            session.save(student2);
//先进行save操作
            
            Set students
=new HashSet();
            students.add(student1);
            students.add(student2);
            Classes classes
=new Classes();
            classes.setName(
"尚学堂");
            classes.setStudents(students);
            session.save(classes);
            
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
            Classes classes
=(Classes)session.load(Classes.class3);
            System.out.println(classes.getName());
            Set students
=classes.getStudents();
            
for(Iterator iter=students.iterator();iter.hasNext();){
                Student student
=(Student)iter.next();
                System.out.print(student.getName()
+";");
            }

            
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

2 一对多关联映射(双项Classes<--->Student)

一对多双向关联映射:
  * 在一一端的集合上用<key>,在对方表中加入一个外键指向一的一端
  * 在多的一端采用<many-to-one>
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段错误

如果在一的一端维护一对多关联关系,hibernate会发出多余的update语句,所以我们一般在多的一端来维护关联关系

关于inverse属性:
   inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
   默认inverse为 false,所以我们可以从一的一端和多的一端维护关联关系,
   如果设inverse为true,则我们只能从多的一端来维护关联关系
注意:inverse属性,只影响数据的存储,也就是持久化。

inverse和cascade:
  * inverse是关联关系的控制方向
  * cascade是操作上的连锁反应

<!--
  Classes:                                      Student:
    private int id;                               private int id;
    private String name;                   private String name;
    private Set students;//必须用 Set private Classes classes;
-->
<class name="Classes">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<set name="students" inverse="true" cascade="all">
                //cascade属性:none 不及连 save-update 插入或更新及连 delete删除及连 all
            
<key column="classesid"/>
            
<one-to-many class="Student"/>
        
</set>
</class>

<class name="com.my.hibernate.Student">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<many-to-one name="classes" column="classesid" cascade="save-update"/>
</class>
public void testSave1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//在多方维护
            Classes classes=new Classes();
            classes.setName(
"北青");
            
//session.save(classes);//加了cascade属性可以不用
            Student student1=new Student();
            student1.setName(
"黄不接10");
            student1.setClasses(classes);
            session.save(student1);
            
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//从多方读取
            Student student=(Student)session.load(Student.class5);
            System.out.println(student.getName());
            System.out.println(student.getClasses().getName());
            
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testSave2(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//在一方维护,自动转向多方
            Classes classes=new Classes();
            classes.setName(
"尚学堂");
            Student student1
=new Student();
            student1.setName(
"10");
            student1.setClasses(classes);
            Student student2
=new Student();
            student2.setName(
"祖儿");
            student2.setClasses(classes);
            Set students
=new HashSet();
            students.add(student1);
            students.add(student2);
            classes.setStudents(students);
    
            session.save(classes);
            
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

多对多关联映射(单项User---->Role)
<many-to-many/>标签
<set>标签中加入属性table="t_user_role"创建关联表
<!--
  User:                              Role:
  private int id;                   private int id;
    private String name;     private String name;
    private Set roles;
-->        
<class name="com.my.hibernate.Role">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
</class>

<class name="User">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<set name="roles" table="t_user_role">
            
<key column="userid"/>
            
<many-to-many class="Role" column="roleid"/>
        
</set>
</class>
public void testSave1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            Role role1
=new Role();
            role1.setName(
"1111");
            Role role2
=new Role();
            role2.setName(
"2222");
            Role role3
=new Role();
            role3.setName(
"3333"color: #0
分享到:
评论

相关推荐

    hibernate-release-5.0.7.Final.zip官方

    Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。Hibernate 5.0.7.Final 版本作为 Hibernate 5.0 系列中的一个稳定版...

    hibernate-release-4.2.20.Final.zip

    Hibernate 4.2.20.Final是这个系列中的一个重要里程碑,它在4.x版本的基础上进行了多方面的优化。 二、核心概念 1. 实体(Entity):在Hibernate中,实体对应数据库表,是一个Java类,通过注解或XML配置与数据库表...

    SSH(Spring+Hibernate+Struts2)框架整合必须的85个jar包

    它通过ORM(对象关系映射)实现了数据库的透明访问。 - `hibernate-core.jar`:Hibernate的核心库,包含实体管理、会话工厂和查询API。 - `hibernate-entitymanager.jar`:支持JPA(Java Persistence API)。 - ...

    hibernate-release-5.2.6.Final.zip

    Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,自其诞生以来就受到了广大开发者的热烈追捧。它简化了数据库与Java对象之间的交互,使得开发者可以专注于业务逻辑,而无需过多地关注底层SQL语句的编写。...

    hibernate-search-3.1.1.GA-dist

    同时,使用了内存映射文件技术(MMap)来提高I/O效率,使得大规模数据的检索更为迅速。 除了基本的搜索功能,Hibernate Search还提供了对地理位置信息的支持。通过集成JTS(Java Topology Suite),开发者可以对...

    hibernate 一对多测试工程

    【hibernate 一对多测试工程】是一个基于Hibernate框架的示例项目,旨在演示和测试Hibernate在处理一对一和一对多关系映射时的功能和用法。在这个工程中,我们可以通过具体的代码实例深入理解如何配置和操作数据库中...

    Hibernate+IDEA 2018 一个hibernate程序

    以上步骤详细介绍了如何使用Hibernate+IDEA 2018构建一个完整的Hibernate程序,包括环境搭建、项目配置、文件结构设计、配置文件解析、实体类与映射文件编写以及单元测试等内容。通过这些步骤,可以实现一个简单的...

    spring-framework-3.0.5.CI-849-with-docs.zip

    对于Spring 3.0.5 CI-849,可能意味着对3.0.5版本中的一些bug进行了修复,或者增加了新的特性和优化。 8. **文档资源**: 随着“with-docs”一起提供的文档,涵盖了Spring框架的全面教程、API参考以及最佳实践。...

    整合struts2.2.1+spring3.0.4+hibernate3.6选择jar包

    这三个框架分别负责处理不同的层面:Struts2用于MVC(Model-View-Controller)架构中的控制层,Spring作为依赖注入和事务管理的核心,而Hibernate则用于对象关系映射(ORM)。为了确保项目的高效运行,合理地选择和...

    myeclipse-ci-2018.12.0-online-installer-windows.rar

    【标题】"myeclipse-ci-2018.12.0-online-installer-windows.rar" 是一个针对Windows操作系统设计的MyEclipse集成开发环境的持续集成版本的在线安装程序。MyEclipse是一款功能强大的Java集成开发环境,特别适合进行...

    Struts-Spring-Hibernate-MySql-JDK-ibatis

    3. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以使用Java对象来操作数据库,而无需编写SQL。`hibernate api帮助文档.chm`可能包括实体管理...

    java 一对多的操作

    首先,我们需要理解一对多关系的基础概念。在数据库设计中,"一对多"意味着一个表(父表)中的单条记录可以与另一个表(子表)中的多条记录相对应。例如,用户表(User)与订单表(Order)之间可能是一对多关系,每...

    Hibernate3学习笔记(一)-hibernate概述和简单实例入门

    8. **关联映射**:讨论一对一、一对多、多对一、多对多四种关联关系的映射实现。 9. **事务管理**:阐述Hibernate如何处理事务,包括自动提交、显式事务控制等。 10. **实体状态管理**:解析瞬时态、持久态、托管态...

    Tapestry5 + spring + hibernate 开发指南

    - **集合属性**:对于多对多或一对多关系使用懒加载。 #### IX. 结论 本文档提供了一个关于如何使用 Tapestry5、Spring 和 Hibernate 构建 Web 应用的详细教程。从环境搭建到实际编码实现,涵盖了整个开发流程的...

    hibernate 开发指南下载

    - 双向一对多:除了单向关联外,每个其他实体也拥有指向该实体的引用。 - **多对多关联**: - 多对多关联通常需要一个中间表来存储关联关系。 #### 七、数据访问与优化技巧 - **PO和VO**: PO (Persistent Object...

    Hibernate连表查询 Hibernate连表查询

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连...

    Hibernate原理

    2. **一对多(One-to-Many)**:用于表示一个实体与多个实体之间的关联关系,例如,一个订单可以包含多个订单项。 3. **多对多(Many-to-Many)**:用于表示两个实体集合之间的多对多关联关系,这种关系通常需要...

    sqlite-hibernate

    Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,而无需编写大量的SQL代码。SQLite则是一种轻量级、无服务器、自包含的数据库引擎,常用于嵌入式系统或对数据库需求...

Global site tag (gtag.js) - Google Analytics