美文网首页
关系部分 一对多的单项

关系部分 一对多的单项

作者: 打死你的小乌龟 | 来源:发表于2018-01-16 09:16 被阅读0次
1.建立两个类
public class Classes implements Serializable{
    private Long cid;
    private String name;
    private String description;
    private Set<Student> students;
    setter getter 方法省略
}
从Classes端能联系到Student,但是从Student端联系不到Classes,这种情况称为一对多的单项
-----------------------------------------------------------------------------
public class Student implements Serializable{
    private Long sid;
    private String name;
    private String description;
    setter getter 方法省略
}
2.映射文件的配置
Clasess.hbm.xml的配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.hw.entity.Classes">
        <id name="cid" length="5">
            <generator class="increment"></generator>
        </id>
        <property name="name" length="20"></property>
        <property name="description" length="50"></property>

        <set name="students" cascade="save-update" inverse="false">
            <key>
                <column name="cid"></column>
            </key>
            <one-to-many class="com.hw.entity.Student"/>
        </set>
    </class>
</hibernate-mapping>
Clasess.hbm.xml的配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.itheima11.hibernate.onetomany.single.Student">
        <id name="sid" length="5">
            <generator class="increment"></generator>
        </id>
        <property name="name" length="20"></property>
        <property name="description" length="50"></property>
    </class>
</hibernate-mapping>

级联

前提条件有两个:

1、在映射文件中:配置
2、在代码中,必须建立关联

3、必须显示操作classes

session.save(classes);

cascade与inverse的区别:

cascade指的是对象与对象之间的关系
  all
  delete
  save-update

inverse针对的是外键
  inverse  是否维护关系 
  true   不维护关系
  false  维护关系
         default:false

说明

在执行session.flush的时候,
1、会检查hibernate一级缓存中所有的持久化状态的对象,来决定发出
 insert语句或者update语句
2、会检查这些持久化对象中有没有关联对象,如果有,则再次去检查这些 持久化状态的对象中有
没有设置级联.
如果有则检查关联对象是否是持久化状态的对象
         如果是,则再次检查副本
         如果不一样,则隐式发出update语句
         关联对象不是持久化状态的对象
         则发出insert语句
3、检查持久化对象是否有维护关系的权利,就是检查持久化对象对应的映射文件
  中的inverse属性是否为false/default,如果是该值,则会自动维护关系(会发出
            维护关系的update语句)

列如:

保存班级级联保存学生

Session session  = sessionFactory.openSession();
       Transaction transaction =  session.beginTransaction();
       
       Classes classes = new Classes();
       classes.setName("陆梅坡");
       classes.setDescription("梅须逊雪三分白");
       Student student = new Student();
       student.setName("白朴");
       student.setDescription("淡烟衰草孤村");
       
       Set<Student> students = new HashSet<Student>();
       students.add(student);
       classes.setStudents(students);
       
       session.save(classes);
       
       transaction.commit();
       session.close();    

保存班级级联更新学生

    Session session  = sessionFactory.openSession();
        Transaction transaction =  session.beginTransaction();
        
        Classes classes = new Classes();
        classes.setName("陆梅坡");
        classes.setDescription("梅须逊雪三分白");
        Student student = session.get(Student.class, 1L);
        student.setName("哈哈");
    
        
        Set<Student> students = new HashSet<Student>();
        students.add(student);
        classes.setStudents(students);
        
        session.save(classes);
        
        transaction.commit();
        session.close();

更新班级级联更新学生

Session session  = sessionFactory.openSession();
        Transaction transaction =  session.beginTransaction();
        
        Classes classes = new Classes();
        classes.setName("陆梅坡");
        classes.setDescription("梅须逊雪三分白");
        Classes clasess = session.get(Classes.class, 1l);
        Set<Student> students = classes.getStudents();
        classes.setDescription("s");
        for(Student student:students){
            student.setDescription("x");
        }
        
        classes.setStudents(students);
        
        session.save(classes);
        
        transaction.commit();
        session.close();

相关文章

  • 关系部分 一对多的单项

    1.建立两个类 从Classes端能联系到Student,但是从Student端联系不到Classes,这种情况称...

  • MyBatis学习:高级映射之一对多查询

    订单项和订单明细是一对多的关系,所以主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了。首先还是先写...

  • Day60 - Flask模型关系与查询、钩子函数、装饰器登录校

    一对一关系 其他与一对多关系一样 一对多关系 一对多模型定义 一对多关系查询 多对多关系 多对多关系模型定义 定义...

  • 2018-12-20 模型关系和钩子函数

    一、模型关系定义 1.1 一对多   一对多关系中的查询操作 1.2 一对一 1.3 多对多   创建多对多关系 ...

  • Django 模型间的关系

    Django模型之间的关系 Django模型的对应关系,一对一,一对多,以及多对多的关系。 一对一 OneToOn...

  • day3-django模型对应关系

    模型的对应关系,一对一,一对多,以及多对多的关系。 模型对应关系描述如下:1:1 一对一 OneToOneFi...

  • Models and Databases 11.例子

    关系 多对多 关系 多对一 关系 一对一

  • @OneToMany注解的使用

    假设有两个表,订单表和产品表,订单跟产品的关系是一对多的关系,那么在JPA中怎样表示一对多的关系呢?实体关系一对多...

  • 02MySQL的多表操作

    MySQL的多表操作 1 多表关系 MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多 1.1...

  • 八:关联关系

    表的关系:MySQL相互关联的表之间存在一对一,一对多(多对一),多对多的关系 1.一对一的关系:表1中的一条数据...

网友评论

      本文标题:关系部分 一对多的单项

      本文链接:https://www.haomeiwen.com/subject/wkwjoxtx.html