关系部分 一对多的单项

2018-01-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();
上一篇 下一篇

猜你喜欢

热点阅读