hibernate中对象与对象的关系(二):list,一对一,多对多

①:list  还是用学生和班级举例子,list是将学生添加进list集合时的顺序

Clazz类

public class Clazz {
    private Long id;
    private String name;
    private List<Student> stus = new ArrayList<>();
}

Student类:

public class Student {
    private Long id;
    private String name;
    private Clazz clz;//Clazz类为Student的字段
}

Clazz.hbm.xml;

<hibernate-mapping package="objectn.exus.s3_list">
    <class name="Clazz">
        <id name="id" column="c_id">
            <generator class="native"/>
        </id>
      <property name="name" />

    <list name="stus">
        <key column="c_id"></key>
        <!-- list是有序的,将学生对象添加到list集合的顺序 -->
        <index column="index123" ></index>
        <one-to-many class="Student"/>
    </list>

    </class>

</hibernate-mapping>

Student.hbm.xml;

<hibernate-mapping package="objectn.exus.s3_list">
    <class name="Student">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <!-- 多对一,name为类中的变量 ,column为生成的列名-->
      <many-to-one name="clz" column="c_id"></many-to-one>
    </class>
</hibernate-mapping>

②:一对一  即身份证号对应每一个人

IDCard类:

public class IDCard {
    private String name;
    private Long id;
    private Person per;
}

Person类:

public class Person {
    private Long id;
    private String name;
    private IDCard card;
}

IDcard.hbm.xml;

<hibernate-mapping package="objectn.exus.s4_one2one">
    <class name="IDCard">
        <id name="id" column="c_id">
            <generator class="foreign">
                <param name="property">per</param>
            </generator>
        </id>
      <property name="name" />
      <!-- constrained:添加一个主键约束 -->
      <one-to-one name="per" constrained="true"/>
    </class>
</hibernate-mapping>

person.hbm.xml;

<hibernate-mapping package="objectn.exus.s4_one2one">
    <class name="Person">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <one-to-one name="card"/>
    </class>
</hibernate-mapping>

测试类:

public void testsave12() {
        IDCard card = new IDCard("asdasd");
        Person p = new Person("张三");
        card.setPer(p);
        p.setCard(card);
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(p);//先保存主键
        session.save(card);
        transaction.commit();
        session.close();
}

③:多对多,即学生和老师的关系

Student类:

public class Student {
    private Long id;
    private String name;
    private Set<Teacher> teac = new HashSet<>();
}

Teacher类:

public class Teacher {
    private Long id;
    private String name;
    private Set<Student> stus = new HashSet<>();
}

Student.hbm.xml;

<hibernate-mapping package="objectn.exus.s5_many2many">
    <class name="Student">
        <id name="id" column="s_id">
            <generator class="native"></generator>
        </id>
      <property name="name" />
         <!--
        t_tea_stu: 设置中间表的表名
        -->
      <set name="teac" table="t_tea_stu" >
        <!--
        key:代表中间表的和当前对象对应的ID的列名
            设置中间表的那一列关联到当前表
        -->
          <key  column="id_stu"/>
          <!--
        class: 设置对方的类名
        column: 代表对方对象在中间表的列名
                设置中间表的哪一列关联到对方的表
        -->
          <many-to-many class="Teacher" column="id_tea" ></many-to-many>
      </set>
    </class>
</hibernate-mapping>

teacher.hbm.xml;

<hibernate-mapping package="objectn.exus.s5_many2many">
    <class name="Teacher">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <set name="stus" table="t_tea_stu">
          <key column="id_tea"></key>
          <many-to-many class="Student" column="id_stu"></many-to-many>
      </set>
    </class>
</hibernate-mapping>
时间: 2024-10-17 21:28:51

hibernate中对象与对象的关系(二):list,一对一,多对多的相关文章

[2]工欲善其事必先利其器-------UML中的几种常见关系(二)

目录 1.UML类图中几种常见的关系 经过(一)中介绍,我选择的是StarUML作为UML的学习工具,个人喜好,至少在功能上能够满足我现在的需求, 在介绍StarUML的使用之前首先介绍下UML中几种常见的关系: UML类图中常见的关系按照关系的强弱可分为:泛化 ,实现 ,组合, 聚合 , 依赖这几种 1.泛化关系:是一种继承关系,也就是XX is a kind of XX 描述. 2.实现关系:是一种类与接口的关系. 3. 组合关系:是一种强关联,属于一种整体与部分的关系,但是部分不能离开整体

Hibernate中双向的一对多关系

何为双向,双向的意思就是你我之间可以互相通信(customer(1)和order(n)) 也就是说customer可以访问order,order也可以访问customer 二者构成了双向的关系 在Hibernate中如何实现双向的一对多关系呢?? 步骤: I在1的一端(也就是customer)添加n端(order)的集合列表,并添加get和set方法 package com.jeremy.hibernate.app.example.both; import java.util.HashSet;

hibernate中实体类对象的四种状态

1.临时状态(transient):用new语句创建,还没有被持久化,并且不在Session的缓存中. 标识:OID为null,没有和Session建立关系.2.持久化状态(persistent):已经计划被持久化,并且加入到Session的缓存中.(为什么说计划:因为事务问题,是否已经提交事务)标识:OID不为null,建立了和Session的关系.3.删除状态(removed):(可以不管,如果说三种状态,就是没有此种)不在Session的缓存中,且Session已经计划将其从数据库中删除.

Hibernate学习笔记(二) — 探索 hibernate 中对象的状态

一.hibernate中对象的状态有三种: 临时.游离和持久化,三种状态转化的方法都是通过session来调用的 什么是持久化? 通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存) 二.三种状态的相互转换 session方法 session.save():该方法可以把一个对象从临时装填转换成持久化状态 session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象 session.update():把一

Hibernate利用关联关系操纵对象

利用关联关系操纵对象 数据对象之间关联关系有一对一.一对多及多对多关联关系.在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难.本节讲解如何在Hibernate中处理这些对象之间的关联关系.本节使用到4个类,它们分别是Student(学生).Card(学生证).Group(班级)和Course(课程),它们之间的关联关系如图1-1所示.这些实体存在级联(cascade)问题.例如,当删除一个班级的信息时,还要删除该班的所有学生的基本信息.如果直接使用JDBC执行这种级联操作,会非常烦琐

hibernate的3种继承映射关系总结——TPH,TPS,TPC

Java类中有继承关系,相应的在hibernate中,也有继承关系,子类反应到数据库中,就有多种实现形式了,子类和父类可以映射到同一张表中,子类也可以单独映射成一张表,但是用不同的标签实现,子类表和父类表的关系也不同. 下面对以前做的project进行总结一下 为了将程序领域中的继承关系反映到数据 中,Hibernate为我们提供了3中方案: 第一种方案:每棵类继承树一张表(Table Per Hierarchy)TPH 第二种方案:每个子类一张表(Table Per Subclass)TPS

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

hibernate中懒加载急加载的区别,get方法和load方的区别法

懒加载是hibernate中的关联关系对象的默认方式,懒加载也会先去查询对象然后获取对象的id, 当正真要对数据进行使用时才会正真写sql语句. 懒加载的有效加载期是在session打开的时候,所以在我们要使用到懒加载的时候必须要保持session的开启. 急加载就是直接用sql语句去访问数据库,但速度相对于懒加载更快. get()方法在执行时会立刻向数据库发出sql语句. load()方法和懒加载类似也是只有当真正使用该实体的属性时才会发出sql语句: 还有就是当数据库中查询不到东西时,方法会

详解Hibernate中的一级缓存

1.前言 在Hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存. 2.持久化对象 如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象. 其中持久化对象有三种状态,分别是: transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收.一般就是直接New创建的对象. persistent(持久态):已经与当前session产生关联,并且相关联的session没