Hibernate 添加数据 一 (一对多)

Hibernate 添加数据 (一对多)

  • 类级别检索:当前对象所有属性值。例如:Customer自己数据
  • 关联级别检索:当前对象关联对象数据。例如:Customer 关联 Order 数据

1 新增普通类数据


class Person{
    private int id ;
    private String name;
    private int age ;
    //get set 方法省略 
}

配制文件清单 Person.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.Person"
        dynamic-insert="true" dynamic-update="false" table="t_person_list">
        <!-- 主键 -->
        <id name="id">
            <generator class="native"></generator>
        </id>
         <!-- 属性 name配制  -->
        <property name="name" length="51" type="string"></property>
        <!-- 属性 age配制  -->
        <property name="age" type="integer"></property>

    </class>

</hibernate-mapping>

新增数据操作


public void addModel(){

    Person person = new Person();
    person.setName("xx");
    person.setAge(12);


    Session session = H3Utils.getCurrentSession();
     session.beginTransaction();
     //保存 
     //当执行save方法的时候 会
     session.save(person);

     session.getTransaction().commit();

}

说明:

当执行 save 方法时  会调用一次 insert语句 
insert into t_person_list (name, age) values(?, ?)


2 新增一对多数据


class Person{
    private int id ;
    private String name;
    private int age ;
    //一对多 一个Person 中有多个 Course 
    private Set<Course> courseSet = new HashSet<>();
    //get set 方法省略 
}

class Course{
    private int id;
    private String name;
    //多对一 多个Course 对应一个Person 
    private Person person;
}

配制文件清单 Person.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.Person"
        dynamic-insert="true" dynamic-update="false" table="t_person_list">
        <!-- 主键 -->
        <id name="id">
            <generator class="native"></generator>
        </id>
         <!-- 属性 name配制  -->
        <property name="name" length="51" type="string"></property>
        <!-- 属性 age配制  -->
        <property name="age" type="integer"></property>
        <!-- 一对多配制  -->
        <set name= "coureSet" inverse="true" >
              <!-- 关联 另一方的外键  -->
              <key column="cid"></key>
              <!--  另一方  -->
              <one-to-many class="com.Course"/>
        </set>
    </class>

</hibernate-mapping>

配制文件清单 Course.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.Course"
        dynamic-insert="true" dynamic-update="false" table="t_person_list">
        <!-- 主键 -->
        <id name="id">
            <generator class="native"></generator>
        </id>
         <!-- 属性 name配制  -->
        <property name="name" length="51" type="string"></property>

         <!-- 多对一配制  -->
         <many-to-one name="person" column="cid" class="com.Person" ></many-to-one>

    </class>

</hibernate-mapping>

新增数据操作 一 (只保存Person)


public void addModel(){

    Person person = new Person();
    person.setName("xx");
    person.setAge(12);


    Session session = H3Utils.getCurrentSession();
     session.beginTransaction();
     //保存 
     //当执行save方法的时候 会
     session.save(person);

     session.getTransaction().commit();

}

说明 一:

当执行 save 方法时  会调用一次 insert语句 
insert into t_person_list (name, age) values(?, ?)

新增数据操作 二 (只保存Course)


public void addModel(){

    Course course = new Course();
    course.setName("java");


    Session session = H3Utils.getCurrentSession();
     session.beginTransaction();
     //保存 
     //当执行save方法的时候 会
     session.save(course);

     session.getTransaction().commit();

}

说明 二 :

当执行 save 方法时  会调用一次 insert语句 
insert into t_c_list (name) values(?)

新增数据操作 三 (保存Person 和 Course Person关联Courser 主关联从表)


public void addModel(){

   Session currentSession = H3Utils.getCurrentSession();
    currentSession.beginTransaction();

    Person person = new Person();
    person.setName("xiaolong");
    person.setAge(13);

    Course course = new Course();
    course.setName("javaee");

    //person 关联 course
    person.getCourseSet().add(course);

    //保存course 
    currentSession.save(course);
    //保存person
    currentSession.save(person);
    currentSession.getTransaction().commit();

}

说明 三 :

当执行 currentSession.save(course); 方法时  会调用一次 insert语句 
insert into t_c_list (name) values(?)

当执行 currentSession.save(person); 方法时  会调用一次 insert语句 
insert into t_person_list (name, age)  values (?, ?)

最后 发现 此时操作的 course 与 person 没有建立主从关系,这是因为我们设置了Person中主表一对多中,inverse属性为true,不主动去维护关系,所以没有建立

新增数据操作 四 (保存Person 和 Course Courser关联Person 从表关联主表)


public void addModel(){

   Session currentSession = H3Utils.getCurrentSession();
    currentSession.beginTransaction();

    Person person = new Person();
    person.setName("zhan san");
    person.setAge(12);

    Course course = new Course();
    course.setName("java se");
    //course 关联 person 
    course.setPerson(person);

    //保存course 
    currentSession.save(course);
    //保存person
    currentSession.save(person);
    currentSession.getTransaction().commit();

}

说明 四:

当执行 currentSession.save(course); 方法时  会调用一次 insert语句 
insert into t_c_list (name) values(?)

当执行 currentSession.save(person); 方法时  会调用一次 insert语句 
insert into t_person_list (name, age)  values (?, ?)

当最后commit时 执行  
update t_c_list  set name=?, cid=? where id=?

从而建立了主从关系映射

新增数据操作 五 (保存Course 和 Person 并且进行双向关联 )

public void addPersonAndCourseFuoncion1() {
    Session currentSession = H3Utils.getCurrentSession();
    currentSession.beginTransaction();

    Person person = new Person();
    person.setName("xiaosan");
    person.setAge(12);

    Course course = new Course();
    course.setName("javas");

    //person 关联 course
    person.getCourseSet().add(course);

    //course 关联 person 
    course.setPerson(person);

    //保存course 
    currentSession.save(course);
    //保存person
    currentSession.save(person);
    currentSession.getTransaction().commit();
}

说明 五:

当执行 currentSession.save(course);  方法时  会调用一次 insert语句 
insert into t_c_list (name) values (?)

当执行 currentSession.save(person);  方法时  会调用一次 insert语句 
insert  into t_person_list (name, age) values (?, ?)

最后commit的时候  (因为我们这里设置了主表 inverse属性为true 不主动去维护从表数据)
update t_c_list  set name=?,cid=? where id=?

综述说明 : 上述几次操作中,当有关联关系的时候,我们必须同时保存 Person 对象 和 Course 对象 ,因为刚刚创建的Person 对象 与刚刚 创建的 Course对象 都是瞬时态,当一方保存到数据库中后,状态变为了持久态,其如果去维护更新另一方时,另一方也应是持久态。

新增数据操作 六 (保存Course 和 Person 并且进行双向关联,使用级联操作 )

一对多关系,一方为主表方,多方为从表方 

<set name="courseSet" cascade="save-update">
            <key column="customer_id"></key>
            <one-to-many class="com.itheima.c_onetomany.Order"/>
</set>

cascade 
    设置为none , 没有级联操作
    设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,那么将触发级联操作,将瞬时态的多方转为持久态,也就是多执行了一次insert,最后再执行update 
    设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方  
    设置为 delete-orphan,孤儿删除 
    设置为 all,代表 可以拥有 save-update 和 delete 总和
    cascade  设置为 all-delete-orphan,代表 所有  


可以在主表方 Person的配文件 Person.hbm.xml 设置cascade 
<set name="courseSet" cascade="save-update">
            <key column="cid"></key>
            <one-to-many class="com.Course"></one-to-many>
</set>
public void addPersonAndCourseFuoncion1() {
    Session currentSession = H3Utils.getCurrentSession();
    currentSession.beginTransaction();

    Person person = new Person();
    person.setName("xiaosan");
    person.setAge(12);

    Course course = new Course();
    course.setName("javas");

    //person 关联 course
    person.getCourseSet().add(course);
    //course 关联 person 
    course.setPerson(person);


    //保存person
    currentSession.save(person);
    currentSession.getTransaction().commit();
}

说明 六:

当执行 currentSession.save(person);  方法时  会调用一次 insert语句 
insert  into t_person_list (name, age) values (?, ?)
因为设置了级联操作 保存 或者 更新,所有这里会再执行一次insert 将瞬时态的Course对象保存到数据库中
insert into t_c_list (name) values (?)
最后update
update t_c_list  set name=?,cid=? where id=?
早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页